Javascript循环遍历对象数组?

IT技术 javascript
2021-02-26 06:20:36

我正在尝试遍历以下内容:

{
    "messages": [{
        "msgFrom": "13223821242",
        "msgBody": "Hi there"
    }, {
        "msgFrom": "Bill",
        "msgBody": "Hello!"
    }]
}

我想检索msgFrommsgBody

我试过了:

        for (var key in data) {
           var obj = data[key];
           for (var prop in obj) {
              if(obj.hasOwnProperty(prop)){
                console.log(prop + " = " + obj[prop]);
              }
           }
        }

但控制台日志打印 [Object]

任何想法我做错了什么?

6个回答

看来您可能只是错过了 中的"messages"属性data,因此循环可能会迭代根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];
    // ...
}
@JonathanLonowski 谢谢,也许您可​​以将其添加到您的答案中?
2021-04-24 06:20:36
@TravisHeeterfor..in将数组视为一个普通对象,以不能保证的顺序迭代所有可枚举键,而不仅仅是它的索引,0length - 1. 有时,这实际上可能是需要的。通常不会。为什么在数组迭代中使用“for...in”是个坏主意?
2021-05-04 06:20:36
他为什么要考虑使用普通for循环?
2021-05-06 06:20:36
非常感谢您帮助我更改为常规 for 循环!尽快接受。
2021-05-10 06:20:36

您可以使用 forEach 方法迭代对象数组。

data.messages.forEach(function(message){
    console.log(message)
});

参考:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

这个简单而有效
2021-04-17 06:20:36
@sandeep rajbhandari 你能更进一步,告诉我如何一次只返回一条消息而不是一次返回所有消息吗?
2021-04-27 06:20:36
这需要 ECMA Script 2015 并且不能在较旧的浏览器和移动设备中工作。
2021-05-02 06:20:36

在您的脚本中,数据是您的整个对象。

关键是“消息”,这是一个您需要像这样迭代的数组:

    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]);
               }
           }
       }
    }

这里提供的所有答案都使用普通函数,但现在我们的大部分代码都使用 ES6 中的箭头函数。我希望我的回答能帮助读者在我们对对象数组进行迭代时如何使用箭头函数

let data = {
      "messages": [{
           "msgFrom": "13223821242",
           "msgBody": "Hi there"
       }, {
          "msgFrom": "Bill",
          "msgBody": "Hello!"
       }]
 }

使用箭头函数在数组上执行 .forEach

 data.messages.forEach((obj, i) => {
     console.log("msgFrom", obj.msgFrom);
     console.log("msgBody", obj.msgBody);
 });

使用箭头函数在数组上做 .map

 data.messages.map((obj, i) => {
     console.log("msgFrom", obj.msgFrom);
     console.log("msgBody", obj.msgBody);
 });
需要 ECMA Script 2015 并且在旧浏览器中不起作用。
2021-05-09 06:20:36

要循环遍历对象数组或仅在 javascript 中的数组,您可以执行以下操作:

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);
}

还有forEach()函数,它更像“javascript-ish”,代码也更少,但语法更复杂:

cars.forEach(function (car) {
    console.log(car.name);
});

他们都输出以下内容:

// Audi
// BMW
// Ferrari
// Mercedes
// Maserati
谢谢 Tarvo,您的建议非常适合我的需求。
2021-05-09 06:20:36