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

JavaScript循环向空对象添加同键多值时仅存最后一项的问题

循环向空对象添加同键对应值时仅保留最后一组键值对的问题

我是StackOverflow新手,若此问题已有解答深表歉意,此前查找的内容反而让我更困惑,已为此耗费数小时。我的问题是:尝试通过for循环向空对象添加多个同键对应的值时,仅能保留最后一组键值对。我使用if/else语句尝试实现需求,以下是我的代码:

var itemData = [{
    category: 'fruit',
    itemName: 'apple',
    onSale: false
  },
  {
    category: 'canned',
    itemName: 'beans',
    onSale: false
  },
  {
    category: 'canned',
    itemName: 'corn',
    onSale: true
  },
  {
    category: 'frozen',
    itemName: 'pizza',
    onSale: false
  },
  {
    category: 'fruit',
    itemName: 'melon',
    onSale: true
  },
  {
    category: 'canned',
    itemName: 'soup',
    onSale: false
  },
];

let list = {  }


for (let i = 0; i < items.length; i++) {
  
if (items[i].category === 'fruit' && items[i].onSale === false) { 
       Object.assign(list, {fruit : [`${items[i].itemName}`]})  
       
   }
  else if (items[i].category === 'fruit' && items[i].onSale === true) { 
     list.fruit.push(`${items[i].itemName}${'($)'}`)
   
   }
else if (items[i].category === 'canned' && items[i].onSale === false) {

Object.assign(list, {canned : [`${items[i].itemName}`,] })  
    list.canned.push(`${items[i].itemName}`)
  }
  
}

当前console.log(list)输出为:

{
  canned: ["soup", "soup"],
  fruit: ["apple", "melon($)"]
}

但我期望的输出是:

{
  canned: ["beans", "soup"],
  fruit: ["apple", "melon($)"]
}

恳请各位提供帮助,谢谢。


解答

问题根源有两点:

  1. 变量名不匹配:循环中使用的items未定义,实际数据源变量是itemData,这会导致循环逻辑异常;
  2. 重复覆盖数组:处理canned类别的非折扣商品时,每次都用Object.assign重新创建新数组覆盖原有数据,再重复push当前项,最终只保留最后一次循环的内容。

修改后的代码如下:

var itemData = [{
    category: 'fruit',
    itemName: 'apple',
    onSale: false
  },
  {
    category: 'canned',
    itemName: 'beans',
    onSale: false
  },
  {
    category: 'canned',
    itemName: 'corn',
    onSale: true
  },
  {
    category: 'frozen',
    itemName: 'pizza',
    onSale: false
  },
  {
    category: 'fruit',
    itemName: 'melon',
    onSale: true
  },
  {
    category: 'canned',
    itemName: 'soup',
    onSale: false
  },
];

let list = {};

// 修正变量名,遍历正确的数据源
for (let i = 0; i < itemData.length; i++) {
  const item = itemData[i];
  
  if (item.category === 'fruit') {
    // 先判断数组是否存在,不存在则初始化
    if (!list.fruit) list.fruit = [];
    list.fruit.push(item.onSale ? `${item.itemName}($)` : item.itemName);
  } else if (item.category === 'canned' && !item.onSale) {
    // 先判断数组是否存在,不存在则初始化
    if (!list.canned) list.canned = [];
    list.canned.push(item.itemName);
  }
}

console.log(list);

执行后输出符合预期:

{
  canned: ["beans", "soup"],
  fruit: ["apple", "melon($)"]
}

也可以用Array.reduce简化逻辑,代码更简洁:

const list = itemData.reduce((acc, item) => {
  if (item.category === 'fruit') {
    acc.fruit = acc.fruit || [];
    acc.fruit.push(item.onSale ? `${item.itemName}($)` : item.itemName);
  } else if (item.category === 'canned' && !item.onSale) {
    acc.canned = acc.canned || [];
    acc.canned.push(item.itemName);
  }
  return acc;
}, {});

console.log(list);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:30:47