我需要过滤包含在另一个对象数组中的对象数组中的一些数据。这是我的数据的示例结构。我需要过滤categories。
[
{
id: 540,
name:'Makeup kit'
slug:'makeup-kit',
status:'publish',
categories: [
{
id: 42, name:'Fashion',slug:'fashion'
},
{
id: 43, name:'Beauty',slug:'beauty'
}
]
},
{
id: 541,
name:'Silicon gloves'
slug:'silicon-gloves',
status:'publish',
categories: [
{
id: 44, name:'Health',slug:'health'
}
]
},
{
id: 650,
name:'Julep Mask'
slug:'julep-mask',
status:'publish',
categories: [
{
id: 43, name:'Beauty',slug:'beauty'
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试的方式
beautyProducts=temp1.filter(product=>product.categories.filter(cat=>cat.id===43))
Run Code Online (Sandbox Code Playgroud)
但我的解决方案似乎不起作用。
Array#filter()期望你给它的函数返回一个真值或假值。函数返回真值的元素保留在新数组中,而那些给出假值的元素将被删除。
您只想保留其中一个类别的id值为 43 的元素。那么,在这里使用第二个过滤器是没有意义的:它返回一个数组,并且数组始终为真;因此第一个过滤器将始终为每个元素接收一个数组,并且所有元素都保存在新数组中。
而不是第二个过滤器,您应该使用Array#some()- 您想知道是否有任何类别有id===43,如果没有,那么您需要一个假值,以便产品从结果中排除。
简单的改变:
beautyProducts = temp1.filter(product => product.categories.some(cat => cat.id === 43))
Run Code Online (Sandbox Code Playgroud)
这是一个工作示例:
beautyProducts = temp1.filter(product => product.categories.some(cat => cat.id === 43))
Run Code Online (Sandbox Code Playgroud)