Запустите функцию рекурсивно в Javascript

#javascript

Вопрос:

Я создал эту функцию:

 const demoD = (
  obj,
  toChange,
  newV,
) => {
  return Object.keys(obj).reduce((acc, key) => {

    if (typeof obj[key] === 'object') {
      demoD(obj[key], toChange, newV);
    }
    acc[key] = obj[key] === toChange ? newV : obj[key]
    return acc
  }, {})
}

const obj = {
  name: '',
  age: '687',
  demo: {
    test: ''
  }
}

console.log(demoD(obj, '', null)) 

Идея этой функции состоит в том, чтобы изменить значение объекта на новое, и она должна выполняться рекурсивно.
Я ожидаю такого результата:

 const obj = {
  name: null',
  age: '687',
  demo: {
    test: null'
  }
} 

Но я не получаю этого результата, и test он все еще остается неизменным.
Вопрос: Как исправить и в чем проблема?

Комментарии:

1. Ваш рекурсивный вызов to demoD ничего не делает с возвращаемым значением.

2. Как изменить функцию?

3. измените рекурсивный вызов на return demoD(obj[key], toChange, newV);

Ответ №1:

Если вы хотите применить изменения к исходному объекту на месте:

 const demoD = (
  obj,
  toChange,
  newV,
) => {
  return Object.keys(obj).reduce((acc, key) => {

    if (typeof obj[key] === 'object') {
      demoD(obj[key], toChange, newV);
    }
    acc[key] = obj[key] === toChange ? newV : obj[key]
    return acc
  }, obj) // 👈 send in obj here
}
 

Если вы не хотите изменять свой исходный объект, то он должен быть:

 const demoD = (
  obj,
  toChange,
  newV,
) => {
  return Object.keys(obj).reduce((acc, key) => {

    if (typeof obj[key] === 'object') {
      acc[key] = demoD(obj[key], toChange, newV)
    } else {
      acc[key] = obj[key] === toChange ? newV : obj[key]
    }
    return acc
  }, {})
}