在对象数组中查找值

时间:2014-01-29 09:41:24

标签: javascript object underscore.js key-value-coding

我有一个对象数组,每个对象包含n个键/值对。我需要返回一个值为x的对象数组。

使用Underscore.js我可以使用_.findWhere但是我不知道该值的关键字。

我显然可以循环数组,获取每个对象中的所有键,然后在每个键上运行_.findWhere并检查值是否存在,但这似乎不是一个好方法

3 个答案:

答案 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); 
});