2016-06-12 121 views
2

有没有一种方法可以通过特定的值过滤对象数组,可以在任何属性?基于值过滤对象数组

比方说,我有这样的对象:

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

做工作,但它是一个强力方法。 有没有更好的方法来实现相同的结果?

回答

4
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如果任何数组的元素的匹配条件,它返回一个布尔值的组合,这也(每个对象的键在这种情况下),只要停止迭代所述阵列它找到一个匹配。如果您需要跨浏览器支持(由于某种原因没有使用巴贝尔)的ES 5.0版本以上是

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; 
    }); 
}); 
+0

@nnnnnn良好的感谢。 –

+0

也许包括一个ES5版本,以匹配OP的代码。 – 1983

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

3

使用一个内部循环的方法来检查个别属性值

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