
let test=[ { "id": 28620, "name": "茌平粉煤灰[Ⅱ级]", "dn": "掺合料" }, { "id": 5941, "name": "粉煤灰[Ⅰ 级]", "dn": "掺合料" }, { "id": 5226, "name": "粉煤灰[Ⅱ级]", "dn": "掺合料" }] //需求是只改变 dn 为其他 //改变后值为 test=[ { "id": 28620, "name": "茌平粉煤灰[Ⅱ级]", "dn": "其他" }, { "id": 5941, "name": "粉煤灰[Ⅰ 级]", "dn": "其他" }, { "id": 5226, "name": "粉煤灰[Ⅱ级]", "dn": "其他" }] // 这是我用到的方法 test=test.map((item)=>({ 'id':item.id, 'name':item.name, 'dn':'其他' })) //这种方法是可行但是不优雅,因为就为了改变一个值还要把其他的也写上,有什么更好的方法实现吗? 1 akaxiaok339 2022-05-12 09:46:47 +08:00 解构呀 |
2 noe132 2022-05-12 09:47:26 +08:00 via Android |
3 KotlinAmai 2022-05-12 09:48:13 +08:00 test = test.map((item) => ({ ...item, 'dn': '其他' })) |
4 cjd6568358 2022-05-12 09:49:27 +08:00 test=test.forEach((item)=>item.dn='其他') -------------------------- JSON.parse(JSON.stringfy(test).replace('dn:xxx','dn:qita')) |
5 alanhe421 2022-05-12 09:51:12 +08:00 跟 json 啥关系?单单数组,做法就是这样,如楼上,缺的是个解构 但假如本身只是个大的字符串,除了 JSON.parse 转为数组,进行处理之外,本身也可以直接 replace 正则。只是不差这点性能了。 |
6 yuan321 OP 谢谢,这三种方法都很好 |
7 yaphets666 2022-05-12 10:10:24 +08:00 test.forEach(item => item.dn = '其他') 就行了。这里边其实挺有玄机的,值传递~内存,指针~ |
8 akatquas 2022-05-12 10:22:42 +08:00 纯纯提问,使用高级语法糖,就是优雅的意思吗? |
9 learningman 2022-05-12 10:25:04 +08:00 via Android @akatquas 函数式编程就是优雅的意思 |
10 yuan321 OP @yaphets666 感觉这种写法确实有点匪夷所思 |
11 libook 2022-05-12 10:34:46 +08:00 只改值不改字段,直接循环改值应该是最方便的,如用 forEach 方法或者干脆 for 循环。 涉及到改字段名的话,也可以用循环,然后在每个对象里加个新字段,再 delete 旧字段;或者就用解构。 另外要考虑下文是否还会用到修改之前的数组,如果用到的话也可以在这边新建数组修改,保留原数组的形态。 |
12 reiji 2022-05-12 10:39:03 +08:00 https://developer.mozilla.org/zh-CN/docs/Web/Javascript/Reference/Global_Objects/JSON/parse#%E4%BD%BF%E7%94%A8_reviver_%E5%87%BD%E6%95%B0 如果数据是从服务器拉过来的,可以直接在解析 json 的时候使用 reviver 函数处理 |
13 libook 2022-05-12 10:40:42 +08:00 @yuan321 #10 JS 里面赋值有两种情况,一种是 string 、number 、bool 等简单类型的值复制,即 a=1;b=a ,那么 a 和 b 的值都是 1 ,但修改 a 不会导致 b 的值变化;另一种是对象、数组等的引用,即 a=[1];b=a;当给 a push 新元素之后,b 也随之改变。这个是 JS 最常用的基本的原理之一,用熟练了就不会觉得奇怪了。 |
15 forbreak 2022-05-12 11:00:03 +08:00 有个 json path 的包,可以用 set('*.dn','其他') 这种方式修改值。但是你这个单层也没必要。 多层 json 的话挺好用。 |
16 brader 2022-05-12 11:27:28 +08:00 ``` $test = '[{"id":28620,"name":"茌平粉煤灰[Ⅱ级]","dn":"掺合料"},{"id":5941,"name":"粉煤灰[Ⅰ 级]","dn":"掺合料"},{"id":5226,"name":"粉煤灰[Ⅱ级]","dn":"掺合料"}]'; $test = json_decode($test); foreach ($test as $item) { $item->dn = '其他'; } ``` 用 PHP 吧,少年,哈哈哈 |
17 KousukeSakurako 2022-05-12 12:26:40 +08:00 写个 for 循环很麻烦吗 |
18 wangtian2020 2022-05-12 13:12:40 +08:00 3 楼 4 楼都是标准答案,应该没有其他不引包的好办法了 我倾向于使用 Array 的 map 或者 forEach |
19 jifengg 2022-05-12 13:35:05 +08:00 用 map 和解构,生生的多出一个数组的内存占用和解构耗时,并且 test 的引用也变了。 forEach 或者 for 才是正解。楼主自己也说了,只是改一个字段的值,为什么要把其他字段也写上呢。 自己简单测试一下,仅仅楼主的三个字段的 obj ,map 耗时是 for[Each]的 10 倍多。 |
20 huai 2022-05-12 13:43:38 +08:00 test.forEach(i => i.dn = '其他') test.map(i => i.dn = '其他') // 只执行,不要考虑返回 原来的值 不在意的话,两种方法没啥区别。 |
21 rehoni 2022-05-12 13:59:24 +08:00 楼主写的有点嗦,map 和 forEach 是可以简写的,楼上已经有很多例子了。。而且我感觉会用 map 应该就会用 foreach 才对啊。。 |
22 Envov 2022-05-12 14:06:31 +08:00 @yaphets666 这个代码其实性能蛮好,但是搞习惯了 immutable 看这个真的难受 |
25 yaphets666 2022-05-12 14:33:36 +08:00 @Envov 其实注意到这种事情就 ok |
26 mybyons 2022-05-12 17:55:21 +08:00 看到了我的家乡 茌平 估计 99% 不知道这个地方 也不知道怎么念这个名字 |
27 dfourc 2022-05-12 18:09:19 +08:00 @yuan321 #23 你可以在 js 所有循环方法更改元素属性,find,filter,some,map,every, 他们的区别只是返回值和执行顺序而已,从性能上考虑,自然是 test.forEach(i => i.dn = '其他')最好,map 还要返回 |
28 LLaMA2 2022-06-07 11:20:12 +08:00 歪一下,map 的话入参变成 async 然后 Promise.all 可以并发的跑,量大的话还是能快过 forEach |