JavaScript 如何高效将两个同长度数组按索引配对生成对象数组
数组合并为对象数组的效率说明
所有能完成该需求的实现,时间复杂度均为O(n)——毕竟要生成n个存储对应索引值的对象,不存在跳过逐位取值、组装结果的捷径,不存在量级上的效率差距,不同实现的差异仅来自运行时的微小开销、写法的简洁度。
效率最优的优化写法
你当前的for循环实现已经处于效率第一梯队,仅需要修正两个微小的性能损耗点,就能达到最快运行速度:
- 给循环变量
i加上块级声明(let i = 0),避免未声明的变量变成全局属性 - 预分配结果数组的内存长度,规避
push方法在数组空间不足时触发的动态扩容开销
优化后的代码:
const newArray = new Array(x.length) for (let i = 0; i < x.length; i++) { newArray[i] = { x: x[i], y: y[i] } }
可读性优先的简洁实现
如果对代码简洁度要求更高,可以用内置map方法完成组装。这个API是JS引擎深度优化过的遍历方法,仅存在可忽略的函数调用开销,日常开发场景和原生for循环的运行速度没有可感知的差距:
const newArray = x.map((xVal, index) => ({ x: xVal, y: y[index] }))
不推荐的高开销写法
部分语法看起来优雅,但存在不必要的运行时开销,实际效率低于裸for循环,长数组场景不建议使用:
- 用
for...of搭配迭代器解构遍历,迭代器协议的额外跳转开销会拖慢遍历速度 - 引入第三方工具库的zip类方法完成组装,额外的跨函数调用没有必要
边界提醒:如果两个输入数组长度不一致,需要取两个数组的最小长度作为遍历的终止条件,否则会取到
undefined的异常值。
内容的提问来源于stack exchange,提问作者Xon
相关产品推荐
相关产品推荐

