为了账号安全,请及时绑定邮箱和手机立即绑定

map 是否可以改变对象?

map 是否可以改变对象?

德玛西亚99 2021-10-21 10:50:03
我有一个非常奇怪的案例,它表明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};

});


查看完整回答
反对 回复 2021-10-21
  • 1 回答
  • 0 关注
  • 208 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信