Задать вопрос
@fessss

Как переписать значения во вложенных объектах?

Есть объект:

const data = {
  name1: {
    blblaDate: '12-31-2021',
    arr: [
      {
        blablaDate: '12-31-2021',
      },
    ],
  },
  name2: {
    blblaDate: '12-31-2021',
    arr: [
      {
        blablaDate: '12-31-2021',
      },
    ],
  },
}

Может быть сколько угодно вложенный. Надо найти все ключи, которые содержат Date и изменить значения:

blablaDate: '12-31-2021' -> blablaDate: '31.12.2021'
  • Вопрос задан
  • 219 просмотров
Подписаться 1 Средний 2 комментария
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
  • Skillbox
    JavaScript
    3 месяца
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Рекурсия есть:

const replaceValues = (val, test, replacer, key) =>
  test(key, val)
    ? replacer(val)
    : val instanceof Object
      ? Object.entries(val).reduce((acc, [ k, v ]) => (
          acc[k] = replaceValues(v, test, replacer, k),
          acc
        ), val.constructor())
      : val;

Рекурсии нет:

function replaceValues(val, test, replacer) {
  const stack = [];
  const clones = new Map;
  const getClone = (v, k) =>
    test(k, v)
      ? replacer(v)
      : v instanceof Object
        ? (clones.has(v) || stack.push([ v, clones.set(v, v.constructor()).get(v) ]),
           clones.get(v))
        : v;

  if (val instanceof Object) {
    for (getClone(val); stack.length;) {
      const [ source, target ] = stack.pop();
      for (const k in source) if (Object.hasOwn(source, k)) {
        target[k] = getClone(source[k], k);
      }
    }
  }

  return getClone(val);
}

Как применять в вашем случае:

const newData = replaceValues(
  data,
  k => k?.endsWith('Date'),
  v => v.replace(/(\d+)-(\d+)-/, '$2.$1.')
);
Ответ написан
@fessss Автор вопроса
Получилось своими силами разобраться
function recursive(data) {
  for(const key in data) {
    if(typeof data[key] === 'object') {
      recursive(data[key]);
    } else {
      if(key.includes('Date')) {
        data[key] = moment(data[key], 'MM-DD-YYYY').format('DD.MM.YYYY') 
      }
    }
  }
  return data;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы