js 循环如何不污染原来的对象啊!

2019-09-28 23:07:12 +08:00
 coderabbit
  let data =[{},{}]
  console.log(data);
  data.forEach(function (item) {
	item.status = 123;
  });

结果打印 data 的时候 里面多了个 key status 把源数据污染掉了。我不想它污染源数据,有什么办法处理呢! 还有 V2 回贴的时候 markdown 为啥没用呢!该如何回呢!

2045 次点击
所在节点    问与答
15 条回复
huihuimoe
2019-09-28 23:10:12 +08:00
lodash deep clone
Sanko
2019-09-28 23:12:22 +08:00
序列化再反序列化
deepdark
2019-09-28 23:19:49 +08:00
深克隆
hackyuan
2019-09-28 23:30:22 +08:00
```js
const newData = data.map(i => {
return {
...i,
status: 123
}
});
// 仅支持浅层,多层需要 deep clone
```
chuxiaonan
2019-09-28 23:34:05 +08:00
data.slice().forEach/for...of
data.map/flatMap
很多方法感觉
chuxiaonan
2019-09-28 23:35:20 +08:00
@chuxiaonan 哎呀不对 slice()不行。。
zhujinliang
2019-09-29 00:11:54 +08:00
用 console.log(JSON.stringify(data))
neptuno
2019-09-29 07:39:18 +08:00
转成 json,再转回来,,,
jatai
2019-09-29 08:33:01 +08:00
...展开运算符,真香
w292614191
2019-09-29 08:43:40 +08:00
JSON.parse
JSON.stringify
只能用于一些简单的对象克隆。
duzhihao
2019-09-29 11:37:35 +08:00
只能深拷贝吧,
rick2c
2019-09-29 12:17:31 +08:00
既然不想修改(污染),为什么要操作引用数据
coderabbit
2019-09-29 15:09:58 +08:00
@hackyuan 谢谢
@rick2c 肯定要对原数据操作组装新数据。
@chuxiaonan flatMap 我刚查了下 是 es10 的特性啊。我还停留在 es6 之前!不知道现在 bable 是否能转 es10
chuxiaonan
2019-09-29 20:53:48 +08:00
@coderabbit babel 能 transpile 的相当多 甚至很多没进入规范的都能转 比如装饰器,Observable 之类的
SoloCompany
2019-09-29 21:29:24 +08:00
data.map(x -> ({...x, status: 123}))

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/605193

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX