如何防止映射在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})
。