Javascript 按数组中的值筛选对象数组中的数组

Javascript 按数组中的值筛选对象数组中的数组,javascript,arrays,Javascript,Arrays,我有一个对象数组,每个对象中都有一个嵌套的整数数组 [ { “标题”:“富”, “日期”:“2018-02-08T15:55:16”, “作者”:2, “类别”:[ 229, 190 ] }, { “标题”:“酒吧”, “日期”:“2018-02-08T15:55:16”, “作者”:2, “类别”:[ 199, 17 ] }, { “标题”:“Baz”, “日期”:“2018-02-08T15:55:16”, “作者”:2, “类别”:[ 199, 229 ] } ] 我想做的是从给定的Ca

我有一个对象数组,每个对象中都有一个嵌套的整数数组

[
{
“标题”:“富”,
“日期”:“2018-02-08T15:55:16”,
“作者”:2,
“类别”:[
229,
190
]
},
{
“标题”:“酒吧”,
“日期”:“2018-02-08T15:55:16”,
“作者”:2,
“类别”:[
199,
17
]
},
{
“标题”:“Baz”,
“日期”:“2018-02-08T15:55:16”,
“作者”:2,
“类别”:[
199,
229
]
}
]
我想做的是从给定的CategoryId数组中检索一个对象数组-[229,17]会检索前两个项吗

尝试使用过滤器,但难以进入类别数组

var-selectedCategories=[229,17];
posts=posts.filter(函数(c){
返回所选类别。包括(c.类别);
});
//发布输出:[]

对于每篇文章,您应该查看其关联类别中是否有一个id存在于
selectedCategories
中。一个简单的<代码>。。。在
帖子中的
循环中的。过滤器
回调应该执行以下操作:

var posts=[
{
“标题”:“富”,
“日期”:“2018-02-08T15:55:16”,
“作者”:2,
“类别”:[
229,
190
]
},
{
“标题”:“酒吧”,
“日期”:“2018-02-08T15:55:16”,
“作者”:2,
“类别”:[
199,
17
]
},
{
“标题”:“Baz”,
“日期”:“2018-02-08T15:55:16”,
“作者”:2,
“类别”:[
199,
230//注意:我做这个230是为了排除这个项目
]
}
];
var selectedCategories=[229,17];
posts=posts.filter(函数(c){
对于(c类的let categoryId){
if(selectedCategories.includes(categoryId))返回true;
}
返回false;
});

控制台日志(posts)您非常接近,但必须对照每个选定类别检查每个类别(或直到找到匹配项)。您可以使用
.some()
完成此操作

var posts=[
{
“标题”:“富”,
“日期”:“2018-02-08T15:55:16”,
“作者”:2,
“类别”:[
229,
190
]
},
{
“标题”:“酒吧”,
“日期”:“2018-02-08T15:55:16”,
“作者”:2,
“类别”:[
199,
17
]
},
{
“标题”:“Baz”,
“日期”:“2018-02-08T15:55:16”,
“作者”:2,
“类别”:[
199,
229
]
}
]
var selectedCategories=[229,17];
posts=posts.filter(p=>
p、 类别。一些(cat=>selectedCategories.includes(cat))
);

console.log(posts)
您可以创建一个类来重用您的筛选操作。

let dataArray=[{“title”:“Foo”,“date”:“2018-02-08T15:55:16”,“author”:2,“categories”:[229190]},{“title”:“Bar”,“date”:“2018-02-08T15:55:16”,“author”:2,“categories”:[19917]},{“title”:“Baz”,“date”:“2018-02-08T15:55:16”,“author”:2,“categories”: [      199,      229    ]  }];
函数MyFilter(数组){
this.array=数组;
this.withKey=(key)=>{
this.key=key;
归还这个;
}
this.withComparator=(fn)=>{
这个比较器=fn;
归还这个;
};
this.filter=()=>this.array.filter(o=>this.comparator(o[this.key]);
}
设categoryId=[229,17];
让结果=新的MyFilter(dataArray).withKey('categories').withComparator((catArray)=>catArray.some((c)=>CategoryId.some((ic)=>ic==c)).filter();

控制台日志(结果)所以输出将包含所有三个对象,对吗?为什么不包含第三个对象?
posts = posts.filter(p =>
  p.categories.some(cat => selectedCategories.includes(cat))
);