使用另一个数组过滤JavaScript对象

4
我有一个像这样的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());

这个过滤器什么也不返回,只是一个空数组。
请查看jsfiddle链接:https://jsfiddle.net/dajg6ma6/
3个回答

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));


2
这是一个典型的使用 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);


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);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接