2014-01-29 4 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); 
}); 
Смежные вопросы