Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止映射在Javascript中变异数据_Javascript_List_Immutability - Fatal编程技术网

如何防止映射在Javascript中变异数据

如何防止映射在Javascript中变异数据,javascript,list,immutability,Javascript,List,Immutability,我有一个如下所示的对象数组: rawData: 0: {name: "cat", count: 2} 1: {name: "dog", count: 5} 2: {name: "fish", count: 3} 我有一个translatedData,它将count字段乘以2 newData: 0: {name: "cat", count: 4} 1: {name: "dog", count: 10} 2: {name: "fish", count: 6} 我使用以下计算: let newDa

我有一个如下所示的对象数组:

rawData:
0: {name: "cat", count: 2}
1: {name: "dog", count: 5}
2: {name: "fish", count: 3}
我有一个translatedData,它将count字段乘以2

newData:
0: {name: "cat", count: 4}
1: {name: "dog", count: 10}
2: {name: "fish", count: 6}
我使用以下计算:

let newData = Object.assign({}, rawData);

newData = Object.keys(newData).map(key => {
  let newValue = Math.round(newData[key].all*2);
  newData[key].all = newValue;
  return newData[key];
});

我使用地图来执行此计算。我的问题是,当我在console.log中记录这两个数组时,它们都有计算。我希望原始数据具有其以前的状态,并且不受计算的影响。我认为object.assign可以解决此问题。我做错了什么?

如评论中所述,问题是您没有执行深度克隆。您可以这样做,但更简单(更典型)的解决方案是在map调用中手动构造新对象

newData = rawData.map(({name, count}) => ({name, count: count * 2})
如果数据实际上是高度嵌套的,并且这只是一个简化的示例,那么深度克隆选项可能会更好


上面假设您的对象是一个
数组

,正如注释中所述,问题是您没有执行深度克隆。您可以这样做,但更简单(更典型)的解决方案是在map调用中手动构造新对象

newData = rawData.map(({name, count}) => ({name, count: count * 2})
如果数据实际上是高度嵌套的,并且这只是一个简化的示例,那么深度克隆选项可能会更好


上面假设您的对象是一个
数组

映射
是数组方法,在对象上不可用。@根据OP的清晰度,
旧数据
应该是数组。我在那里只看到
原始数据
。@Clarity同样的事情。
映射
是数组方法,在对象上不可用。@Clarity根据OP的清晰度,
oldData
应该是一个数组。我在那里只看到了
rawData
。@同样的事情。在您显示的数据中没有
all
属性?
返回对象。赋值({},newData[key],{all:newData[key].all*2})
.map
中。您显示的数据中没有
all
属性?
返回对象。从
.map
中分配({},newData[key],{all:newData[key].all*2})