根据值过滤对象数组

时间:2016-06-12 23:47:09

标签: javascript arrays object

有没有办法按可能在任何属性中的特定值过滤对象数组?

假设我有这个对象:

var x = [
    {
        name: "one",
        swp: "two"
    },
    {
        name: "two",
        swp: "three"
    },
    {
        name: "aa",
        swp: "bb"
    }
];

使用Array.prototype.filter我可以

x.filter(function(y){ return y.name == "two"; });

然而,这将只返回两个对象中的一个,这两个对象在其任何属性中都具有“两个”值。

尽管

function findValue( value ) {
  var y = [];
  for (obj in x) {
    for (val in x[obj]) {
      if (x[obj][val].match( value )) {
        y.push(x[obj]);
      }
    }
  }
  return y;
}

完成这项工作,但这是一种蛮力的方法。 有没有更好的方法来实现相同的结果?

3 个答案:

答案 0 :(得分:5)

var arrOfObj = []; // objects you're sifting
var prop = 'whatever';

var matches = arrOfObj.filter(obj => Object.keys(obj).some(k => obj[k] === prop));

你想要Array.prototype.filterArray.prototype.some的组合,如果数组中的任何元素与条件匹配,它会返回一个布尔值,它也会停止迭代数组(在这种情况下是每个对象的键) )一旦找到匹配。如果你需要跨浏览器支持(并且出于某种原因不使用babel),上面的ES 5版本是

var arrOfObj = []; // objects you're sifting
var prop = 'whatever';

var matches = arrOfObj.filter(function(obj) { 
  return Object.keys(obj).some(function(k) { 
    return obj[k] === prop; 
  });
});

答案 1 :(得分:3)

显而易见的是将for..in循环与.filter()函数结合使用:



var x = [{name: "one", swp: "two"}, {name: "two", swp: "three"}, { name: "aa", swp: "bb"}];

var filtered = x.filter(function(v) {
  for (var k in v)
    if (v[k] === "two") return true;
});
console.log(filtered);




答案 2 :(得分:3)

使用内部循环方法检查各个属性值

var val ="one";
var res = x.filter(function(item){
     return Object.keys(item).some(function(prop){
         return item[prop] === val;
     });
});