2015-05-11 4 views
2

У меня есть некоторые данные, которые находятся в массиве объектов JSON. Я пытаюсь использовать вложенные forEach циклы для извлечения данных.Вложенный цикл forEach не работает

Данные моделируются как бело. Внутри dataModels есть несколько dataModels и несколько childNodes.

//this is what an example data looks like 
dataModels[0].childNodes[0].appId 

Я пытаюсь сделать что-то вроде следующего:

dataModels.forEach(function(entry){ 
    entry.forEach(function(childrenEntry){ 
     console.log(childrenEntry.appId); 
    }) 
}) 

выше, однако, не работает, и это дает мне ошибку о том, что «запись» не является функцией. Есть ли лучший способ достичь того, что я пытаюсь сделать?

+1

'entry.childNodes.forEach' может быть? И у вас есть опечатка в 'function (childrenEntry {' – DontVoteMeDown

ответ

2

Вы не предназначаетесь для массива внутри объекта entry, для получения нужных данных вам необходимо перебрать свойство childNodes. См. Пример ниже.

var dataModels = []; 

dataModels[0] = { 
    childNodes: [] 
}; 

dataModels[0].childNodes[0] = { 
    appId: "foo" 
}; 

dataModels.forEach(function(entry){ 
    entry.childNodes.forEach(function(childrenEntry) { // was missing a) 
     console.log(childrenEntry.appId); 
    }); 
}); 

JsFiddle demo

0

Мне кажется, что ваше решение является правильным, но Вы пропускаете круглые скобки, и вы не ссылаетесь атрибут ChildNodes:

data.forEach(function(entry){ 
    entry.childNodes.forEach(function(childrenEntry){ 
     console.log(childrenEntry.appId); 
    }) 
}) 
1

Верстка Еогеасп действительно плохая практика. Вместо этого вы можете использовать функцию map() для получения данных.

Предположим, что массив объекта будет таким, как это & сейчас здесь, как использовать карту вместо нескольких foreach();

data = [{ 
 
    dataModels: [{ 
 
     childNodes: { 
 
      appId: 'foo' 
 
     } 
 
    }] 
 
}]; 
 

 

 
data.forEach(function(obj) { 
 
    var res = obj.dataModels.map(function(o) { 
 
     return o.childNodes; 
 
    }); 
 
    console.log(res[0]); 
 
});