我有像这样的对象的Javascript数组
var posts = [
{area: 'NY', name: 'Bla', ads: true},
{area: 'DF', name: 'SFS', ads: false},
{area: 'TT', name: 'SDSD', ads: true},
{area: 'SD', name: 'Engine', ads: false},
{area: 'NSK', name: 'Toyota', ads: false},
];
和另一个像这样的过滤器集合
var filter = ['NY', 'SD'];
我正在尝试使用此过滤器
过滤我的posts
数组
function filtered() {
return posts
.filter(function(post){
return post.ads === true;
})
.filter(function(post){
return filter.indexOf(post.area) > 0;
})
}
console.log(filtered());
并且此过滤器不提供任何内容,只是空数组
答案 0 :(得分:3)
只需要单Array#filter
个方法,第二个条件应为indexOf(post.area) > -1;
,因为索引从0
开始。
var posts = [
{area: 'NY', name: 'Bla', ads: true},
{area: 'DF', name: 'SFS', ads: false},
{area: 'TT', name: 'SDSD', ads: true},
{area: 'SD', name: 'Engine', ads: false},
{area: 'NSK', name: 'Toyota', ads: false},
];
var filter = ['NY', 'SD'];
function filtered(p, f) {
return p
.filter(function(v) {
return v.ads && f.indexOf(v.area) > -1;
})
}
console.log(filtered(posts, filter));

答案 1 :(得分:1)
这是Array.prototype.filter()
和Array.prototype.some()
组合的典型用例。
var posts = [
{area: 'NY', name: 'Bla', ads: true},
{area: 'DF', name: 'SFS', ads: false},
{area: 'TT', name: 'SDSD', ads: true},
{area: 'SD', name: 'Engine', ads: false},
{area: 'NSK', name: 'Toyota', ads: false},
],
filter = ['NY', 'SD'];
result = posts.filter(o => filter.some(f => o.ads && f === o.area));
console.log(result);
// or with filter & includes combo
result = posts.filter(o => o.ads && filter.includes(o.area));
console.log(result);

答案 2 :(得分:0)
您可以使用带有约束的更通用解决方案进行过滤。
function filter(array, constraints) {
return array.filter(function(a) {
return Object.keys(constraints).every(function(k) {
return typeof constraints[k] === 'function' ? constraints[k](a[k]) : a[k] === constraints[k] ;
});
});
}
var posts = [{ area: 'NY', name: 'Bla', ads: true }, { rea: 'DF', name: 'SFS', ads: false }, { area: 'TT', name: 'SDSD', ads: true }, { rea: 'SD', name: 'Engine', ads: false }, { area: 'NSK', ame: 'Toyota', ads: false }],
result = filter(posts, {
ads: true,
area: function (v) { return ['NY', 'SD'].indexOf(v) !== -1; }
});
console.log(result);