map 是否可以改变对象?

我有一个非常奇怪的案例,它表明map 函数改变了对象或lodash 错误地克隆了对象。这段代码只是一个示例:一个将对象作为参数并使用 lodash 中的 cloneDeep 返回它的副本的函数。然后我使用这个对象来生成一个图表。


const copyObject = data => {

  const copy = _.cloneDeep(data);


  const dataWithIndexes = copy.nodes.map((node, index) => {

    node.index = index;

    return node;

  });


  return copy;

};


export const copiedData = copyObject(sampleData);

在这种情况下,条目数据是具有对象数组的对象:


{

  nodes: [

    { name: "transactions.main", layer: 0 },

    ...

  ],

  links: [

    { source: 3, target: 3, value: 4 },

    ...

  ]

}

正如您所看到的那样,根本没有使用 map inside 函数,这就是重点。当我在图表生成函数中使用原始的、未修改的对象时,它工作正常,当我用上面显示的函数复制对象时,它不起作用,但是当我评论这个dataWithIndexes变量时,它又开始工作了。地图是否有可能以任何方式改变复制的对象?或者可能是 lodash 的错?它可能会错误地克隆对象,但另一方面我只使用它上面的地图,它不会以任何方式修改它。


也许有人能帮我解开这个谜T_T


德玛西亚99
浏览 209回答 1
1回答

弑天下

您正在通过覆盖其属性来修改回调中的node对象参数:。这样,数组中的原始对象虽然返回一个新数组,但会发生变异。map(...)indexnode.index = index即使您没有使用 ,这仍然会发生dataWithIndexes,因为map(...)仍在运行,并且当它运行时,它会使用回调中copy.node的新值改变数组中的对象index。为了避免这种情况,node在 map 调用中复制object 参数并在index那里分配新的,然后从回调中返回它:const dataWithIndexes = copy.nodes.map((node, index) => {    return {...node, index};});
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript