You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用前一个元素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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 03:22:32