【问题标题】:return a new object after traversing it recursively递归遍历后返回一个新对象
【发布时间】:2019-11-01 17:20:32
【问题描述】:

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

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

【问题讨论】:

标签: javascript recursion javascript-objects


【解决方案1】:

在您的函数中即时制作副本怎么样?

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

【讨论】:

    【解决方案2】:

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

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

    你也可以在你的函数中进行克隆。

    function modify(object) {
    
      //cloning object
      var copyObject = object.constructor();
    
      Object.keys(copyObject ).forEach(key => {
        if (typeof copyObject[key] === 'object') {
            //...
        }
      });
    
      return copyObject;
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 2020-12-06
      • 1970-01-01
      • 2011-04-18
      相关资源
      最近更新 更多