javascript - 仅显示与不同数组中的所有值匹配的项目列表
问题描述
我目前有一系列 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}]
解决方案
您需要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);
推荐阅读
- sharepoint - 在 PowerApps 中插入新记录时如何设置 Sharepoint 查找字段
- python - 将 S3 的文件夹路径指定为 terraform 的工作目录
- html - 如何在两列内显示容器?
- google-cloud-platform - 在加入并将它们导出到 GCS 之前,如何等待 BigQuery 上的异步表写入?
- python-3.x - 判断Ipython是否在虚拟环境中运行
- java - Private method invoking from outside the class in Java
- php - 如何将“自然连接”转换为 yii2 主动查询?
- java - My application crashes while trying to use Volley
- java - 如何消除 switch case 或 if-else ?并执行以下操作?
- java - 在由许多不同对象实现的接口上使用静态工厂方法是更好的做法吗?