数组对象属性提取:多map遍历vs单遍历push方案对比及性能疑问
数组属性提取方案选择与性能分析
问题背景
需要从给定数组对象中提取属性集合,转换为指定格式的结果对象:
原始数组:
let a = [ {name:'aname',age:21}, {name:'bname',age:22}, {name:'cname',age:23}, {name:'dname',age:24}, {name:'ename',age:25}, {name:'fname',age:26}, {name:'gname',age:27} ]
期望结果:
let ok = { names:'aname;bname;cname;dname;ename;fname;gname', ages:'21;22;23;24;25;26;27' }
现有两种实现方案:
1. Alpha方案:使用数组map方法
// alpha let res = { names:'', ages:'' } res.names=a.map(iter=>iter.name).join(';') res.ages=a.map(iter=>iter.age).join(';') // then return res
2. Beta方案:使用forEach遍历+push收集属性
// beta let res = { names:[], ages:[] } a.forEach(iter=>{ res.names.push(iter.name) res.ages.push(iter.age) }) // then handle res's fields ok.names = res.names.join(';') ok.ages = res.ages.join(';')
方案选择与性能分析
方案选择
日常业务开发优先选Beta方案:
- Alpha方案需要遍历数组两次(一次取
name,一次取age),而Beta方案只遍历一次,数组规模越大,遍历次数的差异带来的性能影响越明显。 - Beta方案逻辑直白,一次遍历同时收齐所有需要的属性,代码可读性也没问题。
- 如果数组规模极小(比如示例里的7个元素),两种方案差异可以忽略,想图简洁用Alpha也完全可行。
大量属性场景下的性能对比
当要提取的属性数量很多时,Alpha方案会比Beta方案慢不少:
- Alpha方案每提取一个属性就要遍历一次数组,提取N个属性就得遍历N次;Beta方案不管要提多少属性,始终只遍历数组一次,遍历过程中同步收集所有目标属性。
- 每次
map都会生成一个新的中间数组,属性越多,产生的中间数组就越多,不仅占用额外内存,还会增加垃圾回收的负担,进一步拖慢性能。
内容的提问来源于stack exchange,提问作者Zhiqiang Guo
相关产品推荐
相关产品推荐

