我有一個對象數組,每個對象都包含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