假设我有一组符合以下模式的对象:
var posts = [
{
title: post_ab,
category_array : [
{ id: 1, slug: category-a },
{ id: 2, slug: category-b }
]
},
{
title: post_ac,
category_array : [
{ id: 1, slug: category-a },
{ id: 3, slug: category-c }
]
},
{
title: post_bc,
category_array : [
{ id: 2, slug: category-b },
{ id: 3, slug: category-c }
]
}
]
我试图过滤上面的数组,只返回category_array包含与指定值匹配的slug的值。
例如,如果我想过滤' category-c',则只返回第2和第3个值(post_ac和post_bc)。
我尝试使用嵌套过滤器,这让我无处可去:
var currentCategory = 'category-b';
var filteredPosts = function( posts ) {
return posts.filter( function( post ){
return post.category_array.filter( function( category ){
return category.slug === currentCategory;
})
})
}
答案 0 :(得分:5)
你必须在内循环中使用Array.prototype.some():
var filteredPosts = function(posts) {
return posts.filter(function(post){
return post["category_array"].some(function(category){
return category.slug === currentCategory;
});
});
}
它会返回boolean
结果,可以在.filter()
回调中使用。
答案 1 :(得分:2)
var posts = [
{
title: 'post_ab',
category_array : [
{ id: 1, slug: 'category-a' },
{ id: 2, slug: 'category-b' }
]
},
{
title: 'post_ac',
category_array : [
{ id: 1, slug: 'category-a' },
{ id: 3, slug: 'category-c' }
]
},
{
title: 'post_bc',
category_array : [
{ id: 2, slug: 'category-b' },
{ id: 3, slug: 'category-c' }
]
}
];
var result = posts.filter(a => a.category_array.some(cat => cat.slug.includes('a')));
console.log(result);
答案 2 :(得分:0)
您可以使用Array.prototype.some
posts.filter(
(elem) => (
elem.category_array.some(
elem => elem.slug === currentCategory;
)
)
)
答案 3 :(得分:0)
您可以设置Array.prototype.find()以获取数组slug
中'category-b'
等于category_array
的第一个元素,并返回该元素(如果存在)将被评估为真实,或者如果不存在,则Array.prototype.filter():
var posts = [{title: 'post_ab',category_array : [{ id: 1, slug: 'category-a' },{ id: 2, slug: 'category-b' }]},{title: 'post_ac',category_array : [{ id: 1, slug: 'category-a' },{ id: 3, slug: 'category-c' }]},{title: 'post_bc',category_array : [{ id: 2, slug: 'category-b' },{ id: 3, slug: 'category-c' }]}],
currentCategory = 'category-b',
result = posts.filter(function (p) {
// Return only the very first element found
return p.category_array.find(function (c) {
return currentCategory === c.slug;
});
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 4 :(得分:-2)
用一些()
替换你的内部过滤器