Javascript цикл через массив объектов?
Я пытаюсь выполнить следующее:
{
"messages": [{
"msgFrom": "13223821242",
"msgBody": "Hi there"
}, {
"msgFrom": "Bill",
"msgBody": "Hello!"
}]
}
Я хочу получить msgFrom
и msgBody
Я пробовал:
for (var key in data) {
var obj = data[key];
for (var prop in obj) {
if(obj.hasOwnProperty(prop)){
console.log(prop + " = " + obj[prop]);
}
}
}
Но журнал консоли печатает [Object]
Любые идеи, что я делаю неправильно?
Ответы
Ответ 1
Похоже, вы просто пропустили свойство "messages"
в data
, поэтому цикл, скорее всего, будет итерации root Object
, а не Array
:
for (var key in data.messages) {
var obj = data.messages[key];
// ...
}
Если data
не был установлен на messages
до данного фрагмента.
Однако, вы должны рассмотреть возможность изменения этого на обычный цикл for
для Array
:
for (var i = 0, l = data.messages.length; i < l; i++) {
var obj = data.messages[i];
// ...
}
Ответ 2
В вашем script данные - это весь ваш объект.
Клавиша - это "сообщения", которые представляют собой массив, который необходимо выполнить для повторения:
for (var key in data) {
var arr = data[key];
for( var i = 0; i < arr.length; i++ ) {
var obj = arr[ i ];
for (var prop in obj) {
if(obj.hasOwnProperty(prop)){
console.log(prop + " = " + obj[prop]);
}
}
}
}
Ответ 3
Вы можете использовать метод forEach для итерации по массиву объектов.
data.messages.forEach(function(message){
console.log(message)
});
См:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
Ответ 4
Предлагаемый цикл цикла довольно хорош, но вы должны проверить свойства с помощью hasOwnProperty
. Я бы предпочел использовать Object.keys()
, который возвращает только "собственные свойства" объекта (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)
var data = {
"messages": [{
"msgFrom": "13223821242",
"msgBody": "Hi there"
}, {
"msgFrom": "Bill",
"msgBody": "Hello!"
}]
};
data.messages.forEach(function(message, index) {
console.log('message index '+ index);
Object.keys(message).forEach(function(prop) {
console.log(prop + " = " + message[prop]);
});
});
Ответ 5
Ссылка на содержимое одного массива, содержащего один или несколько объектов, то есть все в скобках чего-то вроде этого
{messages: [{ "a": 1, "b": 2}]}, просто добавьте [0] в запрос, чтобы получить первый элемент массива
например. сообщения [0] будут ссылаться на объект { "a": 1, "b": 2}
в отличие от сообщений, которые будут ссылаться на весь массив [{ "a": 1, "b": 2}]
оттуда вы можете работать с результатом как типичный объект и использовать Object.keys, например, для получения "a" и "b".