JavaScript如何将字符串ID数组按相邻元素配对生成对象数组
你现在写的map实现有两个不符合需求的问题:
- 输出的数组和原数组一样长,最后一项的
comparatorId是空字符串,和你给的示例(结果长度比原数组少1)对不上 || ''的兜底逻辑有坑,要是数组里本身有空字符串、0这类假值,会被错误替换成空串
下面是几个更靠谱的实现,按好用程度排序:
1. 普通for循环(最推荐,性能最好、不用额外处理边界)
没有多余的语法花活,逻辑最直白,也没有额外的性能损耗。如果原数组长度小于2(比如只有1个元素、是空数组),循环根本不会执行,直接返回空数组,天然适配所有边界情况:
const array2 = []; for (let i = 0; i < array1.length - 1; i++) { array2.push({ comparableId: array1[i], comparatorId: array1[i + 1] }); }
2. slice + map(偏好函数式写法选这个,最简洁)
不想写显式for循环的话,可以先把原数组最后一个元素截掉再做映射,不需要写空值兜底,输出的结果长度天然符合要求:
const array2 = array1.slice(0, -1).map((value, index) => ({ comparableId: value, comparatorId: array1[index + 1] }));
逻辑很简单:我们只需要给除了最后一个元素之外的所有项,配对它紧邻的后一个元素即可。slice(0,-1)刚好把所有要作为comparableId的元素取出来,遍历的时候index+1永远不会超出数组索引范围,不会出现undefined的问题。
3. reduce写法(不推荐,仅作参考)
如果你之前尝试用reduce实现,正确写法如下,但相比前两种方案代码更啰嗦,没有明显优势:
const array2 = array1.reduce((res, cur, idx, arr) => { if (idx < arr.length - 1) { res.push({ comparableId: cur, comparatorId: arr[idx + 1] }); } return res; }, []);
选型建议:追求性能和可维护性优先选普通for循环;如果团队代码规范偏向函数式写法、习惯链式调用数组方法,选slice+map的方案即可,没必要硬凑reduce的写法。
内容的提问来源于stack exchange,提问作者Owais
相关产品推荐
相关产品推荐

