在 JavaScript 中过滤内部过滤器

Lin*_*int 0 javascript

我需要过滤包含在另一个对象数组中的对象数组中的一些数据。这是我的数据的示例结构。我需要过滤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)

但我的解决方案似乎不起作用。

Kla*_*con 7

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)

  • 非常好,尽管我必须挑剔:运算符之间的空格是好事! (3认同)
  • @ggorlen 这是一个完全有效的观点,我已经编辑了答案。:) (2认同)