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

嵌套数组按尺寸分类对象失败,for in循环迭代异常求助

解决嵌套数组按尺寸分类的问题

你的代码核心错误是内层for in循环遍历对象错了——外层循环i对应products里的子数组,内层应该遍历这个子数组(也就是products[i]),但你写的是for (let j in products),相当于又遍历了外层的products数组,导致索引不匹配,自然拿不到正确的元素,甚至会出现undefined报错。

修复方案1:修正for in循环

把内层循环的遍历对象改成当前子数组products[i],同时建议每次取出当前元素,避免重复索引取值:

let products = [
  [
    { product: "t1", price: 123, size: "S" },
    { product: "f1", price: 45, size: "XL" },
    { product: "t5", price: 910, size: "M" }
  ],
  [
    { product: "f2", price: 6.78, size: "L" },
    { product: "t2", price: 910, size: "XL" },
    { product: "t3", price: 910, size: "S" }
  ]
];

let obj = {
  sizesSM: [],
  sizesLXL: []
};

for (let i in products)
  for (let j in products[i]) { // 这里改为遍历当前子数组
    const item = products[i][j];
    if (item.size === "S" || item.size === "M")
      obj.sizesSM.push(item);
    else 
      obj.sizesLXL.push(item);
  }

console.log(obj);

修复方案2:用forEach遍历(更推荐)

for in不适合遍历数组,因为会遍历到原型链上的可枚举属性,用数组原生的forEach方法更直观安全:

let products = [
  [
    { product: "t1", price: 123, size: "S" },
    { product: "f1", price: 45, size: "XL" },
    { product: "t5", price: 910, size: "M" }
  ],
  [
    { product: "f2", price: 6.78, size: "L" },
    { product: "t2", price: 910, size: "XL" },
    { product: "t3", price: 910, size: "S" }
  ]
];

let obj = {
  sizesSM: [],
  sizesLXL: []
};

products.forEach(subArr => {
  subArr.forEach(item => {
    if (["S", "M"].includes(item.size)) {
      obj.sizesSM.push(item);
    } else {
      obj.sizesLXL.push(item);
    }
  });
});

console.log(obj);

修复方案3:扁平化数组后分类(最简洁)

先把嵌套的二维数组转成一维数组,再用filter方法直接分类,代码更简洁易读:

let products = [
  [
    { product: "t1", price: 123, size: "S" },
    { product: "f1", price: 45, size: "XL" },
    { product: "t5", price: 910, size: "M" }
  ],
  [
    { product: "f2", price: 6.78, size: "L" },
    { product: "t2", price: 910, size: "XL" },
    { product: "t3", price: 910, size: "S" }
  ]
];

// 扁平化二维数组为一维
const flatProducts = products.flat();

const obj = {
  sizesSM: flatProducts.filter(item => ["S", "M"].includes(item.size)),
  sizesLXL: flatProducts.filter(item => ["L", "XL"].includes(item.size))
};

console.log(obj);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:09:36