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

JavaScript push方法异常:数组对象重复问题求助

为什么数组中push的对象最终全是同一个?

运行以下JavaScript代码时,push执行前的console.log能输出两个不同的对象,但最终返回的winnerArr数组里两个元素都是最后一个对象{seat: 3, ticketCost: 49},和预期不符:

function pickWinners(numbers) {  
    const winnerArr = [];
    const winnerObj = {};
    for(let i = 0; i < numbers.length; i++) {
        if(numbers[i] % 2 != 0 && i % 2 != 0) {
            winnerObj.seat = i;
            winnerObj.ticketCost = numbers[i];
            console.log(winnerObj);
            winnerArr.push(winnerObj);
        }
    }
    return winnerArr;
}

pickWinners([6, 7, 12, 49])

console.log输出结果(符合预期):

Object { seat: 1, ticketCost: 7 }   
Object { seat: 3, ticketCost: 49 }

返回的数组结果(不符合预期):

0: Object { seat: 3, ticketCost: 49 }  
1: Object { seat: 3, ticketCost: 49 }

期望返回的数组和console.log输出的结果一致。


原因分析

这是因为对象是引用类型——你在循环外只创建了一个winnerObj对象,每次循环里修改的都是这个对象的属性值,而winnerArr.push(winnerObj)其实是把这个对象的引用地址放进了数组里。

也就是说,数组里的两个元素指向的是同一个内存地址的对象。console.log看起来正确,是因为执行console.log时,对象的属性值确实是当前循环的seat和ticketCost;但当循环结束后,这个唯一的对象已经被最后一次循环的属性值覆盖了,所以你最后查看数组时,两个元素显示的都是最后修改后的对象内容。

解决方案

每次符合条件时,创建一个新的对象,而不是复用同一个:

function pickWinners(numbers) {  
    const winnerArr = [];
    for(let i = 0; i < numbers.length; i++) {
        if(numbers[i] % 2 != 0 && i % 2 != 0) {
            // 每次循环创建新对象
            const winnerObj = {
                seat: i,
                ticketCost: numbers[i]
            };
            console.log(winnerObj);
            winnerArr.push(winnerObj);
        }
    }
    return winnerArr;
}

pickWinners([6, 7, 12, 49])

这样数组里的每个元素都是独立的对象,不会互相影响,最终返回的数组就和console.log的结果一致了。

内容的提问来源于stack exchange,提问作者Calor1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:31:18