2014-01-29 99 views
1

我有一個對象數組,每個對象都包含n鍵/值對。我需要返回一個值爲x的對象數組。查找對象數組中的值

使用Underscore.js我可以使用_.findWhere但是我不知道該值的關鍵是什麼。

我明顯可以循環訪問數組,獲取每個對象中的所有鍵,然後在每個鍵上運行_.findWhere並檢查值是否存在,但似乎不是這樣做的好方法。

+0

請告訴我這是爲什麼題外話?我試圖以儘可能最好的方式在對象內找到一個值。 – James

+1

實際上,最好的(即高性能)方式是Object.keys()+ for-loop。 – avetisk

回答

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

這應該做的伎倆:

var filteredList = _.filter(values, function(value){ 
    return _.contains(value, 3); 
});