我有一个对象数组,每个对象包含n
个键/值对。我需要返回一个值为x
的对象数组。
使用Underscore.js我可以使用_.findWhere
但是我不知道该值的关键字。
我显然可以循环数组,获取每个对象中的所有键,然后在每个键上运行_.findWhere
并检查值是否存在,但这似乎不是一个好方法
答案 0 :(得分:1)
我认为,最好的方法是:
Object.prototype.someProperty = function(fn){
for (var key in this) {
if (fn(key, this[key])) return true;
}
return false;
};
Array.prototype.filter = function(fn) {
var a = [],
l = this.length;
for (var i = 0; i < l; i++) {
if (fn(this[i])) a.push(this[i]);
}
return a;
};
// test
var a = [
{a: 6, b: 8}
,{f: 7, c: 6, d: 67}
,{d: 4, c: 5, g: 8}
];
var b = a.filter(function(item){
return item.someProperty(function(k, v){
return v == 8;
});
});
console.dir(b);
答案 1 :(得分:1)
我显然可以循环数组,获取每个对象中的所有键......
是。
编写一个函数,接受一个数组和一个值,在其元素成员中查找,循环遍历数组,遍历当前元素的键,并将包含具有匹配值的成员的对象推送到数组,在迭代后返回它。
function findValues (arr,val) {
var result = [];
for (var i=0,current;i<arr.length;i++) {
current = arr [i];
for (var key in current) {
if (current [key] === val) {
result.push (current);
}
}
}
return result
}
这是example输出
findValues (
[{
a:1,
b:2,
c:3
},{
a:1,
b:2,
},{
a:1,
b:2,
},{
a:1,
b:2,
c:3,
d:4
},{
a:1,
b:2,
}],
3
) //[{"a":1,"b":2,"c":3},{"a":1,"b":2,"c":3,"d":4}]
答案 2 :(得分:1)
这应该可以解决问题:
var filteredList = _.filter(values, function(value){
return _.contains(value, 3);
});