首页 > 解决方案 > 递归遍历后返回一个新对象

问题描述

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

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方法,但是,在我看来,这不是一个优雅的解决方案。

标签: javascriptrecursionjavascript-objects

解决方案


在您的功能中即时制作副本怎么样?

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

推荐阅读