更高效地将数字数组转换为半长度对象数组的JS方法
嘿,很高兴你已经搞定了可用的实现!针对把50个数字的数组转换成25个带prop1(存偶数)和prop2(存奇数)的对象数组这个需求,我可以分享几种更高效或者更简洁的写法,顺便聊聊它们的性能差异~
更高效的实现方式
1. 原生for循环(性能最优)
原生for循环通常是数组操作里的性能天花板——没有额外的函数调用、迭代器开销,直接通过索引访问元素,对大数组的友好度拉满。
场景1:原数组按「偶数、奇数」两两相邻排列
如果你的原数组是按“偶、奇、偶、奇...”这样的顺序排列的,直接步进2遍历即可:
const nums = [/* 你的50个数字数组 */]; const result = []; for (let i = 0; i < nums.length; i += 2) { result.push({ prop1: nums[i], // 取偶数位元素 prop2: nums[i + 1] // 取对应的奇数位元素 }); }
场景2:原数组奇偶顺序无规律
如果原数组里的奇偶数字是随机分布的,先一次遍历分离奇偶,再配对会更高效(只需要两次遍历,比每次判断节省一半的条件判断开销):
const nums = [/* 你的50个数字数组 */]; const evens = []; const odds = []; // 第一步:一次遍历分离奇偶 for (const num of nums) { num % 2 === 0 ? evens.push(num) : odds.push(num); } // 第二步:配对生成结果数组 const result = []; for (let i = 0; i < evens.length; i++) { result.push({ prop1: evens[i], prop2: odds[i] }); }
2. Array.from(平衡性能与简洁性)
如果你想追求代码简洁又不想牺牲太多性能,Array.from是绝佳选择——它的性能接近原生for循环,写法却非常直观:
const nums = [/* 你的50个数字数组 */]; // 直接根据目标数组长度(25)生成每个对象 const result = Array.from({ length: 25 }, (_, index) => ({ prop1: nums[index * 2], prop2: nums[index * 2 + 1] }));
这种写法一眼就能看懂:我们要生成25个元素,每个元素对应原数组里的第index*2和index*2+1位元素,完美契合你的需求。
3. Array.reduce(简洁性优先)
如果你更看重代码的“优雅感”,reduce也能实现,不过性能会略逊于上面两种(因为每次迭代都要调用回调函数),但在中小型数组场景下完全够用:
const nums = [/* 你的50个数字数组 */]; const result = nums.reduce((acc, curr, index) => { if (index % 2 === 0) { // 偶数索引(0、2、4...)时,创建新对象加入结果数组 acc.push({ prop1: curr }); } else { // 奇数索引时,给结果数组最后一个对象补充prop2属性 acc[acc.length - 1].prop2 = curr; } return acc; }, []);
效率对比小总结
- 原生for循环:性能最高,适合对性能要求极高的场景(比如处理超大型数组)。
- Array.from:性能接近for循环,代码简洁易读,是日常开发中平衡性能和代码优雅的首选。
- reduce:代码最简洁,但有额外的函数调用开销,适合中小型数组或者更看重代码风格的场景。
另外要注意:如果原数组奇偶分布无规律,一定要先分离再配对,而不是在每次迭代中判断奇偶——前者只需要50次判断,后者如果用reduce或单循环判断的话,可能需要更多的条件分支,效率会低一些。
内容的提问来源于stack exchange,提问作者skormel
相关产品推荐
相关产品推荐

