有没有办法按可能在任何属性中的特定值过滤对象数组?
假设我有这个对象:
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;
}
完成这项工作,但这是一种蛮力的方法。 有没有更好的方法来实现相同的结果?
答案 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.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;
});
});
答案 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;
});
});