Javascript 递归过滤对象数组
我有这些数据结构Javascript 递归过滤对象数组,javascript,Javascript,我有这些数据结构 products:[ { products_number: 14, products_ID: 'lvs_jeans-man', products_seller: 'a', products_SKU: [ { productSKU_ID: 'nfl_lvs_jeans-man_xl_bl-stripe', productSKU_size:
products:[
{
products_number: 14,
products_ID: 'lvs_jeans-man',
products_seller: 'a',
products_SKU: [
{
productSKU_ID: 'nfl_lvs_jeans-man_xl_bl-stripe',
productSKU_size: 'XL',
productSKU_color: 'Blue_White'
},
{
productSKU_ID: 'nfl_lvs_jeans-man_xl_bk',
productSKU_size: 'XL',
productSKU_color: 'Black'
}
]
},
{
products_number: 15,
products_ID: 'lvs_jeans-man',
products_seller: 'b',
products_SKU: [
{
productSKU_ID: 'nfl_lvs_jeans-man_xl_bk',
productSKU_size: 'XL',
productSKU_color: 'Black'
}
]
},
{
products_number: 16,
products_ID: 'lvs_jeans-man',
products_seller: 'c',
products_SKU: [
{
productSKU_ID: 'nfl_lvs_jeans-man_xl_gy',
productSKU_size: 'XL',
productSKU_color: 'Grey',
}
]
}
]
常数
var id = 'lvs_jeans-man'
var size = 'XL'
var color = 'Black'
如何筛选满足这些条件的项目
products_ID == id
productSKU_color == color
productSKU_size == size
所需的输出是
[{
products_number: 14,
products_ID: 'lvs_jeans-man',
products_seller: 'a',
productSKU_ID: 'nfl_lvs_jeans-man_xl_bk',
},
{
products_number: 15,
products_ID: 'lvs_jeans-man',
products_seller: 'b',
productSKU_ID: 'nfl_lvs_jeans-man_xl_bk',
}]
我尝试的是先过滤products\u ID,然后过滤颜色和大小,这样我就可以在里面获得productSKU\u ID,然后只是玩数组推送,但它返回无法读取未定义的属性“filter”
如何实现所需的输出?函数过滤器不适用,因为您需要使用阵列
中的数据生成自定义输出。产品\u SKU
使用函数reduce
和find
使用此选项
var data={products:[{products\'u number:14,products\'u ID:'lvs\'u jeans-man',products\'u卖家:'a',products\'u SKU:[{productSKU ID:'nfl\'u lvs\'u jeans-man\'u xl\'bl stripe',productSKU\'u尺码:'xl',productSKU颜色:'Blue\',{productSKU_ID:'nfl_lvs_牛仔裤-man_xl_bk',productSKU_尺码:'xl',productSKU颜色:'BLICK'}},{products_编号:15,products_ID:'lvs_牛仔裤-man',products_卖家:'b',products_SKU:[{productSKU_ID:'nfl_lvs_牛仔裤-man_xl_bk',productSKU_尺码:'xl',productSKU颜色:'BLICK'}},{products_编号:16,products_ID:'lvs_牛仔裤-man',products_卖家:'c',products_SKU:[{productSKU_ID:'nfl_lvs_jeans-man_xl_gy',productSKU_size:'xl',productSKU_color:'Grey',}]};
变量id='lvs_牛仔'
变量大小='XL'
var color='黑色'
var结果=数据.产品.减少((a,p)=>{
var发现;
如果(p.products\u ID==ID&(found=p.products\u SKU.find(s=>s.productSKU\u size==size&&s.productSKU\u color==color))){
a、 推({
产品编号:p.产品编号,
产品编号:p.products\U ID,
产品/卖方:p.产品/卖方,
productSKU\u ID:found.productSKU\u ID
});
}
返回a;
}, []);
console.log(结果)
。作为控制台包装器{max height:100%!important;top:0;}
单独使用过滤器
太复杂了,您必须使用更多的数组方法,包括reduce
和find
:
const输入={
产品:[{
产品编号:14,
产品编号:“lvs_牛仔裤男”,
产品(卖方):"a",,
产品/库存单位:[{
产品SKU_ID:“nfl_lvs_牛仔裤-男士_xl_bl-条纹”,
产品SKU_尺寸:“XL”,
产品颜色:蓝色或白色
},
{
产品SKU_ID:'nfl_lvs_牛仔裤-man_xl_bk',
产品SKU_尺寸:“XL”,
产品颜色:“黑色”
}
]
},
{
产品编号:15,
产品编号:“lvs_牛仔裤男”,
产品(卖方):"b",,
产品/库存单位:[{
产品SKU_ID:'nfl_lvs_牛仔裤-man_xl_bk',
产品SKU_尺寸:“XL”,
产品颜色:“黑色”
}]
},
{
产品编号:16,
产品编号:“lvs_牛仔裤男”,
产品(卖方):"c",,
产品/库存单位:[{
产品SKU_ID:'nfl_lvs_牛仔裤-男士_xl_gy',
产品SKU_尺寸:“XL”,
产品颜色:“灰色”,
}]
}
]
};
const matchingProducts=input.products.filter(({products\u ID})=>products\u ID=='lvs\u jeans-man');
常量输出=匹配产品。减少((匹配,产品)=>{
const foundSizeObj=product.products\u SKU.find({productSKU\u color,productSKU\u size})=>{
返回产品SKU_大小=='XL'和产品SKU_颜色=='Black';
});
如果(!foundSizeObj)返回匹配项;
常量匹配={…乘积};
删除match.products\u SKU;
match.productSKU_ID=foundSizeObj.productSKU_ID;
火柴。推(火柴);
返回比赛;
}, []);
console.log(输出);
您可以先按id筛选,然后将产品映射到第一个找到的产品SKU,取出具有未定义产品SKU的产品,并将其映射到结果类型:
const产品=[
{
产品编号:14,
产品编号:“lvs_牛仔裤男”,
产品(卖方):"a",,
产品/库存单位:[
{
产品SKU_ID:“nfl_lvs_牛仔裤-男士_xl_bl-条纹”,
产品SKU_尺寸:“XL”,
产品颜色:蓝色或白色
},
{
产品SKU_ID:'nfl_lvs_牛仔裤-man_xl_bk',
产品SKU_尺寸:“XL”,
产品颜色:“黑色”
}
]
},
{
产品编号:15,
产品编号:“lvs_牛仔裤男”,
产品(卖方):"b",,
产品/库存单位:[
{
产品SKU_ID:'nfl_lvs_牛仔裤-man_xl_bk',
产品SKU_尺寸:“XL”,
产品颜色:“黑色”
}
]
},
{
产品编号:16,
产品编号:“lvs_牛仔裤男”,
产品(卖方):"c",,
产品/库存单位:[
{
产品SKU_ID:'nfl_lvs_牛仔裤-男士_xl_gy',
产品SKU_尺寸:“XL”,
产品颜色:“灰色”,
}
]
}
];
常量过滤器产品=产品=>(id、大小、颜色)=>
products.filter(//首先按id筛选
product=>product.products\u ID==ID
)
.map(//映射到已筛选产品SKU的产品
产品=>({
…产品,
产品\u SKU:product.products\u SKU.find(
信息=>
信息.产品SKU_尺寸===尺寸&&
信息.产品SKU_颜色===颜色
)
})
)
.filter(//取出空产品\u SKU
产品=>
product.products\u SKU!==未定义
);
常量映射结果=产品=>({
产品编号:product.products\u编号,
products\u ID:product.products\u ID,
产品\卖方:产品。产品\卖方,
产品SKU\u ID:product.products\u SKU.productSKU\u ID
});
console.log(
过滤产品(产品)(“lvs_牛仔裤-男士”、“XL”、“黑色”)
.map(mapToResult)
);
最终产品将是您的预期输出。谢谢。它有效:)但如果有1000多种产品,那么更好的方法是先匹配产品id,然后再匹配尺寸和颜色,还是仍然相同?@nfl-x是的,您需要先检查id。谢谢。这也有效,这也有效
var temp1 = this.products.filter((product => product.products_ID === this.id).products_SKU.filter(sku => (sku.productSKU_color === this.color && sku.productSKU_size === this.size)))
const finalProducts = this.products.reduce((final, product) => {
if (product.id === this.id || !this.id) {
return[...final, ...product.products_SKU.reduce((acc, p) => {
if (p.productSKU_size === this.size && p.productSKU_color === this.color) {
return [...acc, {
products_number: product.products_number,
products_ID: product.products_ID,
products_seller: product.products_seller,
productSKU_ID: p.productSKU_ID
}];
}
return acc;
}, [])];
}
return final;
}, []);