【问题标题】:Is it possible for map to mutate object?地图可以改变对象吗?
【发布时间】:2019-09-18 08:36:55
【问题描述】:

我有一个非常奇怪的情况,它表明 ma​​p 函数改变对象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 变量时它开始再次工作。 map 是否有可能以任何方式改变复制的对象?或者也许是 lodash 的错?它可能会错误地克隆对象,但另一方面我只在它上面使用地图,它不会以任何方式修改它。

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

谢谢

【问题讨论】:

    标签: javascript lodash


    【解决方案1】:

    您正在修改map(...) 回调中的node 对象参数,方法是覆盖其index 属性:node.index = index。这样,尽管返回了一个新数组,但数组中的原始对象会发生变异。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      相关资源
      最近更新 更多