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

如何生成新对象并添加到数组?pickWinners函数错误修正

解决pickWinners函数返回重复对象的问题

需求:编写pickWinners函数,接收票价数组(数组索引对应座位号),筛选出座位号和票价均为奇数的获奖者,返回包含seat(座位号)和ticketCost(票价)键的对象数组。

当前执行pickWinners([1,3,5,7,9,11])时返回重复对象,错误输出示例:

[{seat: 5, ticketCost: 11}, {seat: 5, ticketCost: 1}, {seat: 5, ticketCost: 11} ]

期望输出:

[{seat: 1, ticketCost: 3}, {seat: 3, ticketCost: 7}, {seat: 5, ticketCost: 11} ]

当前错误代码:

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

问题原因

你推测的完全正确——循环中只创建了一个对象,每次修改的都是这个对象的属性,而数组里push的始终是这个对象的引用。最终数组里所有元素都会指向最后一次修改后的对象,导致输出重复。

解决方案

需要在每次符合条件时创建新的对象,而非复用同一个对象,以下是两种可行写法:

写法1:循环内条件判断时创建新对象

function pickWinners(numbers) {
  let arr = [];
  for (let i = 0; i < numbers.length; i++) {
    if (i % 2 !== 0 && numbers[i] % 2 !== 0) {
      // 每次符合条件时生成新对象并推入数组
      arr.push({
        seat: i,
        ticketCost: numbers[i]
      });
    }
  }
  return arr;
}

写法2:用数组方法filter+map简化

function pickWinners(numbers) {
  return numbers
    .map((ticketCost, seat) => ({ seat, ticketCost }))
    .filter(item => item.seat % 2 !== 0 && item.ticketCost % 2 !== 0);
}

验证结果

执行pickWinners([1,3,5,7,9,11])会返回期望的数组:

[{seat: 1, ticketCost: 3}, {seat: 3, ticketCost: 7}, {seat: 5, ticketCost: 11} ]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:12:06