如何不使用传统for循环将拆分地址数组按每2个一组合并
更简洁的实现方案
你的现有方案通过map+filter实现了需求,但可以用更高效、简洁的方式完成,以下是两种推荐的现代数组方法实现:
方案一:使用Array.from(最简洁高效)
Array.from可以直接根据目标长度生成新数组,同时完成地址合并,无需额外过滤步骤:
const addressesFinal = Array.from( { length: addressesBad.length / 2 }, (_, idx) => [`${addressesBad[idx * 2][0]}, ${addressesBad[idx * 2 + 1][0]}`] );
- 原理:通过
{ length: addressesBad.length / 2 }指定新数组的长度(每两个元素合并成一个),然后对每个索引idx,直接取原数组中第idx*2和idx*2+1位置的地址字符串,合并后放入子数组。 - 优势:一步到位,避免了
map生成多余元素再过滤的冗余操作,性能更优。
方案二:使用reduce(无push版本)
如果偏好reduce,可以通过累加器直接构建结果,同时规避push(用扩展运算符替代):
const addressesFinal = addressesBad.reduce((acc, cur, idx) => { return idx % 2 === 0 ? [...acc, [`${cur[0]}, ${addressesBad[idx + 1][0]}`]] : acc; }, []);
- 原理:遍历原数组时,仅在偶数索引位置(对应每对地址的第一个元素)进行合并操作,通过扩展运算符将新的合并项加入累加器。
- 注意:此方法相比
Array.from会生成多个中间数组,性能略逊,但符合你“不用push”的要求。
对比你的现有代码
你的原方案中,map会生成与原数组长度相同的临时数组(其中奇数索引的元素是重复的地址对,最后一个元素可能包含undefined),再通过filter过滤掉无效项,存在不必要的计算开销。上面的两种方案都直接生成目标数组,逻辑更紧凑。
内容的提问来源于stack exchange,提问作者Jacob N
相关产品推荐
相关产品推荐

