[英]Sort by size in an array of arrays with objects
我正在尝试按尺寸订购,但是,我不明白为什么它不起作用。 显然错误必须来自“for in”,因为在测试它时我无法完全迭代“产品”。
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) {
if (products[i][j].size === "S" || products[i][j].size === "M")
obj.sizesSM.push(products[i][j]);
else
obj.sizesLXL.push(products[i][j]);
}
console.log(obj);
预期的 output 是在 object 的一侧保存所有尺寸 S 和 M,另一侧保存 L 和 XL。
谢谢!
你可以像这样填写你的sizeSM:
obj.sizesSM = products.flat().filter(product => product.size === "S" || product.size === "M")
您可以适应其他阵列
Ps:顺便说一下,您的内部循环在错误的数组上循环,它也应该在内部数组上循环
你需要更换
for (let j in products) {
和
for (let j 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]) { if (products[i][j].size === "S" || products[i][j].size === "M") obj.sizesSM.push(products[i][j]); else obj.sizesLXL.push(products[i][j]); } console.log(obj);
除了forloop 之外,还可以使用flat 、 filter和reduce来实现。
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 sizeGroupBy = (...size) => products.flatMap(a => a).filter(o => size.includes(o.size)); console.log('sizesSM', JSON.stringify(sizeGroupBy('S', 'M'))); console.log('sizesLXL', JSON.stringify(sizeGroupBy('L', 'XL'))); const restructure = arr => arr.flat().reduce((accumu, current) => { if(['S', 'M'].includes(current.size)) { accumu['sizesSM'] = [...accumu['sizesSM']?? '', current]; } if(['L', 'XL'].includes(current.size)) { accumu['sizesLXL'] = [...accumu['sizesLXL']?? '', current]; } return accumu; }, {}); const obj = restructure(products); for (const [key, value] of Object.entries(obj)) { console.log(key, JSON.stringify(value)); }
不建议将for in
语句与数组一起使用。
基本上for in
用于迭代 object。
您可以在 arrays 上使用for of
语句或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.flat().forEach(product => { if (product.size === 'S' || product.size === 'M') { obj.sizesSM.push(product) } else { obj.sizesLXL.push(product) } }) console.log(obj);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.