我有一个非常奇怪的案例,它表明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
1 回答
弑天下
TA贡献1818条经验 获得超8个赞
您正在通过覆盖其属性来修改回调中的node对象参数:。这样,数组中的原始对象虽然返回一个新数组,但会发生变异。map(...)indexnode.index = index
即使您没有使用 ,这仍然会发生dataWithIndexes,因为map(...)仍在运行,并且当它运行时,它会使用回调中copy.node的新值改变数组中的对象index。
为了避免这种情况,node在 map 调用中复制object 参数并在index那里分配新的,然后从回调中返回它:
const dataWithIndexes = copy.nodes.map((node, index) => {
return {...node, index};
});
添加回答
举报
0/150
提交
取消