2014-01-29 71 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); 
});