2015-09-14 4 views
4

Я пытаюсь отфильтровать массив в javascript и боюсь, когда массив вложен.JavaScript - Фильтр вложенных массивов

На данный момент, дальше я был в состоянии получить фильтрует плоский массив:

var ID = 3 

var arr = [{ id : 1, name: "a" }, { id : 2, name: "b" }, { id : 3, name: "c" }] 

var result = arr.filter(function(obj) {return obj.id == ID;}); 
alert(result[0].name); 

Хотя выше не работает, если массив выглядит следующим образом, вместо:

var arr2 = [ 
    [{ id : 1, name: "a" },{ id : 2, name: "b" }], 
    [{ id : 3, name: "c" },{ id : 4, name: "d" }] 
] 

Два примера могут быть найдены: https://jsfiddle.net/vjt45xv4/

Любые советы по нахождению соответствующего результата на вложенном массиве будут высоко оценены.

Спасибо!

+2

Если массив выглядит так, что вам нужно, результат? (Или вы только хотите найти один объект?) – Ryan

+0

Применить тот же фильтр, который вы используете в своем 'arr' к каждому элементу в' arr2' (поскольку элементы в 'arr2' сами являются массивами) – nem035

ответ

9

Flatten массив затем фильтр это:

arr.reduce(function(a,b) { return a.concat(b); }) 
    .filter(function(obj) { return obj.id == ID; }); 
1
arr2.filter(function(obj) { 
    obj.filter(function(d) { if(d.id == ID){ 
    result = d;}})}); 
alert(result.name); 

Надежда это то, что вы искали. Вместо того, чтобы сплющивать данные здесь, я вошел во вложенный массив до точки, где он был плоским (и соответствовал) и установил там результат.

arr2.forEach(function(d) { 
d.forEach(
    function(dd){ alert(dd.id);if(dd.id==ID){result=dd; }} 
); 
}); 
alert(result.name); 

Редактировать: Как упоминалось в minitech, он работает так же, как и при использовании forEach.

+0

Если вы собираетесь для назначения переменной, почему бы просто не использовать 'forEach'? – Ryan

+1

Да нет никаких аргументов, там это можно сделать! Кроме того, я думаю, что Джон Стриклер упомянул правильный путь, если не искал обходного пути. – hunters30

Смежные вопросы