我有一个非常奇怪的案例,它表明 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
谢谢
答案 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};
});