首页 > 解决方案 > 仅显示与不同数组中的所有值匹配的项目列表

问题描述

我目前有一系列 selectedCategories 和产品列表,如下所示:

let selectedCategories = []
let productList = []

以及如下所示的 JSON 产品列表:

let products = [ 
    { 
        "id": 1, 
        ...
        "categories": [ 
            { "name": "Category 1", "count": 1 }, 
            { "name": "Category 2", "count": 1 }, 
            { "name": "Category 3", "count": 1 } 
        ], 
        ...
    }, 
    { 
        "id": 2, 
        ...
        "categories": [ 
            { "name": "Category 4", "count": 1 },
            { "name": "Category 5", "count": 2 }, 
            { "name": "Category 6", "count": 1 } 
        ], 
        ... 
    }, 
    { 
        "id": 3, 
        ...
        "categories": [ 
            { "name": "Category 5", "count": 1 } 
        ], 
        ...
    } 
]

我只想显示与 selectedCategories 数组中的值匹配的产品。我已经尝试了所有和包括,但似乎无法获得预期的结果:

this.products.filter(product => {
    product.categories.filter(category => {
        if (this.selectedCategories.includes(category.name)) {
            productList.push(product)
        }
    })
})

this.products.filter(product => {
    product.categories.filter(category => {
        this.selectedCategories.every(value => {
            if (value === category.name) {
                productList.push(product)
            }
        })
    })
})

问题是在上面的代码中,它不检查数组中的所有值是否匹配,而只检查是否匹配。

希望的输出类似于:

selectedCategories = [ "Category 5" ]
>>> productList = [{id: 2}, {id: 3}]

selectedCategories = [ "Category 5", "Category 4" ]
>>> productList = [{id: 2}]

我怎样才能做到这一点?

编辑:

如何过滤产品对象中的多个数组?产品结构:

[ 
    { 
        "id": 1, 
        ...
        "categories": [ 
            { "name": "Category 1", "count": 1 }, 
            { "name": "Category 2", "count": 1 }, 
            { "name": "Category 3", "count": 1 } 
        ],
        "styles": [
            { name: "Style 1", count: 1 },
            { name: "Style 2", count: 1 },
        ] 
        ...
    }, 
    { 
        "id": 2, 
        ...
        "categories": [ 
            { "name": "Category 4", "count": 1 },
            { "name": "Category 5", "count": 2 }, 
            { "name": "Category 6", "count": 1 } 
        ],
        "styles": [
            { name: "Style 3", count: 1 },
            { name: "Style 4", count: 1 },
        ] 
        ... 
    }, 
    { 
        "id": 3, 
        ...
        "categories": [ 
            { "name": "Category 5", "count": 1 } 
        ],
        "styles": [
            { name: "Style 3", count: 1 },
        ] 
        ...
    } 
]

预期输出:

selectedCategories = [ "Category 5" ]
>>> productList = [{id: 2}, {id: 3}]

selectedCategories = [ "Category 5", "Style 3" ]
>>> productList = [{id: 2}, {id: 3}]

selectedCategories = [ "Category 5", "Style 3", "Style 4" ]
>>> productList = [{id: 2}]

标签: javascript

解决方案


您需要filter+ every+ some+map来获得所需的输出:

const products = [ { "id": 1, "categories": [ { "name": "Category 1", "count": 1 }, { "name": "Category 2", "count": 1 }, { "name": "Category 3", "count": 1 } ], "styles": [ { name: "Style 1", count: 1 }, { name: "Style 2", count: 1 }, ] }, { "id": 2, "categories": [ { "name": "Category 4", "count": 1 }, { "name": "Category 5", "count": 2 }, { "name": "Category 6", "count": 1 } ], "styles": [ { name: "Style 3", count: 1 }, { name: "Style 4", count: 1 }, ] }, { "id": 3, "categories": [ { "name": "Category 5", "count": 1 } ], "styles": [ { name: "Style 3", count: 1 }, ] } ];

const selectedCategories = [ "Category 5", "Style 3", "Style 4" ]

const result = products.filter(p=>selectedCategories.every(k=>p.categories.some(t=>t.name==k) || p.styles.some(s=>s.name==k))).map(({id})=>({id}));

console.log(result);


推荐阅读