вернуть новый объект после его рекурсивного обхода - PullRequest
0 голосов
/ 19 июня 2019

Я должен манипулировать вложенным объектом. Вот мой код:

function modify(object) {
  Object.keys(object).forEach(key => {
    if (typeof object[key] === 'object') {
      if (object[key].class && object[key].type && object[key].period) {
        object[key].applicableName = `${object[key].class}|${object[key].type}|${object[key].period}`;
        delete object[key].class;
        delete object[key].type;
        delete object[key].period;
      } else {
        modify(object[key]);
      }
    }
  });
}

Вот объект:

[
    {
        "item": [
            {
                "period": "period-CYTM",
                "type": "type-CMLT",
                "class": "class-RFEE",
            },
            {
                "period": "period-FYTD",
                "type": "type-CMLT",
                "class": "class-RFEE",
            },
            {
                "period": "period-ITD",
                "type": "type-ANNL",
                "class": "class-RFEE",
            },
            {
                "period": "period-ITD",
                "type": "type-CMLT",
                "class": "class-RFEE",
            },
            {
                "period": "period-1MTH",
                "type": "type-CMLT",
                "class": "class-RFEE",
            },
            {
                "period": "period-1YR",
                "type": "type-CMLT",
                "class": "class-RFEE",
            },
            {
                "period": "period-10YR",
                "type": "type-ANNL",
                "class": "class-RFEE",
            },
            {
                "period": "period-10YR",
                "type": "type-CMLT",
                "class": "class-RFEE",
            }
        ]
    }
]

Работает нормально, но проблема в том, что он мутирует в исходном объекте. Как я могу заставить мой modify метод возвращать новый измененный объект, а исходный объект остается неизменным ?

Я пытался клонировать исходный объект, а затем передавал клонированный объект методу modify, но, на мой взгляд, это не было элегантным решением.

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Я пытался клонировать исходный объект, а затем передавал клонированный объект методу модификации, но, на мой взгляд, это было не изящное решение.

Почему?Вы не хотите изменять свой исходный объект, и клонирование объектов является наилучшей практикой в ​​этой ситуации.

Вы также можете выполнять клонирование внутри своей функции.

function modify(object) {

  //cloning object
  var copyObject = object.constructor();

  Object.keys(copyObject ).forEach(key => {
    if (typeof copyObject[key] === 'object') {
        //...
    }
  });

  return copyObject;

}
0 голосов
/ 19 июня 2019

Как насчет простого копирования на лету в вашей функции?

function modify(object) {
  const copy = {};
  Object.keys(object).forEach(key => {
    if (typeof object[key] === 'object') {
      if (object[key].class && object[key].type && object[key].period) {
        copy[key].applicableName = `${object[key].class}|${object[key].type}|${object[key].period}`;
      } else {
        copy[key] = modify(object[key]);
      }
    } else {
      copy[key] = object[key];
    }
  });
  return copy;
}
...