地图是否可能使对象变异?

时间:2019-09-18 08:36:55

标签: javascript lodash

我有一个非常奇怪的案例,它表明 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内部函数,这就是重点。当我在图表生成函数中使用原始的,未修改的对象时,它工作正常,当我使用上面显示的函数复制对象时,它不起作用,但是当我注释此 dataWithIndexes 变量时,它将启动再次工作。映射是否有可能使复制的对象发生变异?还是罗达(Lodash)的错?它可能会错误地克隆对象,但另一方面,我仅在其上使用地图,它不会以任何方式对其进行修改。

也许有人可以帮助我解决这个谜语T_T

谢谢

1 个答案:

答案 0 :(得分:3)

您正在通过覆盖node属性map(...)来修改index回调中的node.index = index对象参数。这样,尽管数组中的原始对象返回了一个新数组,但它却被突变了。

即使您没有使用dataWithIndexes,这仍然会发生,这是因为map(...)仍在运行,并且当它运行时,copy.node数组中的对象将使用新的回调中index的值。

为避免这种情况,请在地图调用中复制node对象参数,并在其中分配新的index,然后从回调中返回它:

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