我有一个对象数组,每个对象都包含n
键/值对。我需要返回一个值为x
的对象数组。查找对象数组中的值
使用Underscore.js我可以使用_.findWhere
但是我不知道该值的关键是什么。
我明显可以循环访问数组,获取每个对象中的所有键,然后在每个键上运行_.findWhere
并检查值是否存在,但似乎不是这样做的好方法。
我有一个对象数组,每个对象都包含n
键/值对。我需要返回一个值为x
的对象数组。查找对象数组中的值
使用Underscore.js我可以使用_.findWhere
但是我不知道该值的关键是什么。
我明显可以循环访问数组,获取每个对象中的所有键,然后在每个键上运行_.findWhere
并检查值是否存在,但似乎不是这样做的好方法。
我能明显循环数组,获取所有在每个对象的关键...
是。
编写一个接受数组和值的函数,以在其元素成员中查找,遍历数组,遍历当前元素的键,并将包含具有匹配值的成员的对象推送到数组并在迭代后返回。
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}]
我认为,最好的办法是:
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);
这应该做的伎俩:
var filteredList = _.filter(values, function(value){
return _.contains(value, 3);
});
请告诉我这是为什么题外话?我试图以尽可能最好的方式在对象内找到一个值。 – James
实际上,最好的(即高性能)方式是Object.keys()+ for-loop。 – avetisk