根据值过滤对象数组

Dar*_*lyn 2 javascript arrays object

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

假设我有这个对象:

var x = [
    {
        name: "one",
        swp: "two"
    },
    {
        name: "two",
        swp: "three"
    },
    {
        name: "aa",
        swp: "bb"
    }
];
Run Code Online (Sandbox Code Playgroud)

随着Array.prototype.filter我可以做

x.filter(function(y){ return y.name == "two"; });
Run Code Online (Sandbox Code Playgroud)

但是,这将只返回两个对象中的一个,这两个对象在其任何属性中都具有"两个"值.

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;
}
Run Code Online (Sandbox Code Playgroud)

做的工作,但是一种蛮力的方法.有没有更好的方法来实现相同的结果?

Jar*_*ith 5

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

var matches = arrOfObj.filter(obj => Object.keys(obj).some(k => obj[k] === prop));
Run Code Online (Sandbox Code Playgroud)

你想要一个组合,Array.prototype.filter并且Array.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; 
  });
});
Run Code Online (Sandbox Code Playgroud)