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

时间:2016-10-17 09:07:00

标签: javascript arrays filter

我有像这样的对象的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());

并且此过滤器不提供任何内容,只是空数组

Please check jsfiddle

3 个答案:

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




相关问题