如何用前一个元素groupID数组的最后值替换当前元素groupID数组首值?
优化JavaScript数组的groupID替换逻辑
问题背景
现有如下JavaScript数组testArr,每个对象包含groupID(数组类型)与Letter属性:
let testArr = [ {groupID: [1900, 1890, 1880], Letter: "A"}, {groupID:[1888, 1898, 1908, 1918, 1928, 1938], Letter: "B"}, {groupID: [1927, 1917, 1907], Letter: "A"}, {groupID: [1912, 1922, 1932, 1942, 2012, 2022, 2032, 2042], Letter: "B"}, {groupID: [2039, 2029, 2019, 2009], Letter: "A"}, {groupID: [2013, 2023, 2033], Letter: "B"}, ]
需求:将数组中从第二个元素开始的每个对象的groupID数组的第一个值,替换为前一个对象groupID数组的最后一个值,预期输出如下:
let testArr = [ {groupID: [1900, 1890, 1880], Letter: "A"}, {groupID:[1880, 1898, 1908, 1918, 1928, 1938], Letter: "B"}, {groupID: [1938, 1917, 1907], Letter: "A"}, {groupID: [1907, 1922, 1932, 1942, 2012, 2022, 2032, 2042], Letter: "B"}, {groupID: [2042, 2029, 2019, 2009], Letter: "A"}, {groupID: [2009, 2023, 2033], Letter: "B"}, ]
原实现的不足
现有实现代码冗余,且无法适配async/await场景:
let add = [] for (let i = 0; i < testArr.length; i++){ if (testArr[i].groupID.length != 0){ add.push(testArr[i].groupID[testArr[i].groupID.length-1]) } } for (let i = 1; i < testArr.length; i++){ testArr[i].groupID.splice(0,1, add[i-1]) }
优化方案
1. 简洁的同步实现
无需额外数组存储中间值,直接遍历修改,逻辑更紧凑高效:
// 直接修改原数组 for (let i = 1; i < testArr.length; i++) { const prevLastId = testArr[i-1].groupID.at(-1); // 用at(-1)快速获取数组最后一项 if (prevLastId !== undefined) { testArr[i].groupID[0] = prevLastId; // 直接赋值替换,比splice更高效 } }
at(-1)替代groupID[groupID.length-1],可读性更强;- 直接索引赋值比
splice操作更高效; - 无额外内存占用,代码更简洁。
2. 支持async/await的异步实现
如果需要结合异步操作(比如依赖接口数据),用for...of配合async/await保证顺序执行:
async function updateTestArr(arr) { // 拷贝数组及内部对象,避免修改原数据(可选,按需调整) const updatedArr = [...arr].map(item => ({...item, groupID: [...item.groupID]})); for (let i = 1; i < updatedArr.length; i++) { // 模拟异步逻辑,实际场景替换为真实异步请求 const prevLastId = await new Promise(resolve => { setTimeout(() => resolve(updatedArr[i-1].groupID.at(-1)), 100); }); if (prevLastId !== undefined) { updatedArr[i].groupID[0] = prevLastId; } } return updatedArr; } // 使用示例 updateTestArr(testArr).then(result => { console.log(result); });
- 拷贝操作避免污染原数据,按需选择是否保留;
for...of确保异步操作按顺序执行,保证前项处理完成后再修改当前项;- 可灵活嵌入任意异步逻辑,适配复杂业务场景。
内容的提问来源于stack exchange,提问作者Ben Davidsson
相关产品推荐
相关产品推荐

