如何生成新对象并添加到数组?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
相关产品推荐
相关产品推荐

