递归遍历后返回一个新对象

时间:2019-06-19 03:36:21

标签: javascript recursion javascript-objects

我必须操纵一个嵌套对象。这是我的代码:

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 :(得分:0)

如何在您的函数中即时复制?

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;
}

答案 1 :(得分:0)

  

我尝试克隆原始对象,然后将克隆的对象传递给Modify方法,但是,在我看来,这不是一个很好的解决方案。

为什么?您不想修改原始对象,在这种情况下,克隆对象是最佳实践。

您也可以在函数内部进行克隆。

function modify(object) {

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

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

  return copyObject;

}