I am trying to loop through the following:
const data = {
"messages": [
{
"msgFrom": "13223821242",
"msgBody": "Hi there"
},
{
"msgFrom": "Bill",
"msgBody": "Hello!"
}
]
}
I want to retrieve msgFrom and msgBody
I've tried:
for (const key in data) {
const obj = data[key];
for (const prop in obj) {
if(obj.hasOwnProperty(prop)){
console.log(prop + " = " + obj[prop]);
}
}
}
But the console log prints [Object]
Any ideas what im doing wrong?
13 Answers 13
It appears you may just have missed the "messages" property in the data, so the loop is likely iterating the root Object rather than the Array:
for (var key in data.messages) {
var obj = data.messages[key];
// ...
}
Unless data was set to messages before the given snippet.
Though, you should consider changing that to a normal for loop for the Array:
for (var i = 0, l = data.messages.length; i < l; i++) {
var obj = data.messages[i];
// ...
}
4 Comments
for loop?for..in treats the array as a plain object, iterating all enumerable keys in an order that isn't guaranteed, rather than just its indices, 0 to length - 1. At times, that may actually be desired. Typically not. – Why is using "for...in" with array iteration a bad idea? You can use forEach method to iterate over array of objects.
data.messages.forEach(function(message){
console.log(message)
});
Refer: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
3 Comments
All the answers provided here uses normal function but these days most of our code uses arrow functions in ES6. I hope my answer will help readers on how to use arrow function when we do iteration over array of objects
let data = {
"messages": [{
"msgFrom": "13223821242",
"msgBody": "Hi there"
}, {
"msgFrom": "Bill",
"msgBody": "Hello!"
}]
}
Do .forEach on array using arrow function
data.messages.forEach((obj, i) => {
console.log("msgFrom", obj.msgFrom);
console.log("msgBody", obj.msgBody);
});
Do .map on array using arrow function
data.messages.map((obj, i) => {
console.log("msgFrom", obj.msgFrom);
console.log("msgBody", obj.msgBody);
});
1 Comment
In your script, data is your whole object.
key is "messages", which is an array you need to iterate through like this:
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]);
}
}
}
}
Comments
Iterations
Method 1: forEach method
messages.forEach(function(message) {
console.log(message);
}
Method 2: for..of method
for(let message of messages){
console.log(message);
}
Note: This method might not work with objects, such as:
let obj = { a: 'foo', b: { c: 'bar', d: 'daz' }, e: 'qux' }
Method 2: for..in method
for(let key in messages){
console.log(messages[key]);
}
Comments
To loop through an object array or just array in javascript, you can do the following:
var cars = [{name: 'Audi'}, {name: 'BMW'}, {name: 'Ferrari'}, {name: 'Mercedes'}, {name: 'Maserati'}];
for(var i = 0; i < cars.length; i++) {
console.log(cars[i].name);
}
There is also the forEach() function, which is more "javascript-ish" and also less code but more complicated for its syntax:
cars.forEach(function (car) {
console.log(car.name);
});
And both of them are outputting the following:
// Audi
// BMW
// Ferrari
// Mercedes
// Maserati
1 Comment
The suggested for loop is quite fine but you have to check the properties with hasOwnProperty. I'd rather suggest using Object.keys() that only returns 'own properties' of the object (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]);
});
});
Comments
Here is a generic way to loop through the field objects in an object (person):
for (var property in person) {
console.log(property,":",person[property]);
}
The person obj looks like this:
var person={
first_name:"johnny",
last_name: "johnson",
phone:"703-3424-1111"
};
Comments
let data = {
"messages": [{
"msgFrom": "13223821242",
"msgBody": "Hi there"
},
{
"msgFrom": "Bill",
"msgBody": "Hello!"
}]
}
data.messages.forEach((obj, i) => {
console.log("msgFrom", obj.msgFrom + " msgBody", obj.msgBody);
});
1 Comment
To reference the contents of the single array containing one or more objects i.e. everything in the brackets of something like this {messages: [{"a":1,"b":2}] } ,just add [0] to the query to get the first array element
e.g. messages[0] will reference the object {"a":1,"b":2} as opposed to just messages which would reference the entire array [{"a":1,"b":2}]
from there you can work with the result as typical object and use Object.keys for example to get "a" and "b".
Comments
let data = {
"messages": [{
"msgFrom": "13223821242",
"msgBody": "Hi there"
}, {
"msgFrom": "Bill",
"msgBody": "Hello!"
}]
}
for ( i = 0; i < data.messages.length; i++ ) {
console.log( `Message from ${data.messages[i].msgFrom}: ${data.messages[i].msgBody}` )
}
Comments
for (let key in data) {
let value = data[key];
for (i = 0; i < value.length; i++) {
console.log(value[i].msgFrom);
console.log(value[i].msgBody);
}
}
1 Comment
arr = [{food:"Mandazi", Price: 5},{food:"Black Tea", Price: 20},{food:"Black Coffee", Price: 20}
];
txt = "";
for (i = 0; i ";
}
document.getElementById("show").innerHTML = txt;
console.log(obj, prop);for..inforArrays.[[Prototype]], etc.).