嵌套数组按尺寸分类对象失败,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
相关产品推荐
相关产品推荐

