Javascript循环通过对象数组?

Alo*_*ius 46 javascript

我试图循环以下内容:

{
    "messages": [{
        "msgFrom": "13223821242",
        "msgBody": "Hi there"
    }, {
        "msgFrom": "Bill",
        "msgBody": "Hello!"
    }]
}
Run Code Online (Sandbox Code Playgroud)

我想要检索msgFrommsgBody

我试过了:

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

但控制台日志打印 [Object]

什么想法我做错了什么?

Jon*_*ski 91

看来你可能只是错过了该"messages"属性data,所以循环可能会迭代根Object而不是Array:

for (var key in data.messages) {
    var obj = data.messages[key];
    // ...
}
Run Code Online (Sandbox Code Playgroud)

除非在给定的片段之前data设置messages.

但是,您应该考虑将其更改为以下的正常for循环Array:

for (var i = 0, l = data.messages.length; i < l; i++) {
    var obj = data.messages[i];
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 他为什么要考虑使用普通的“for”循环? (3认同)
  • @TravisHeeter`for..in`将数组视为普通对象,以无法保证的顺序迭代所有可枚举键,而不仅仅是其索引,"0"到"length - 1".有时,实际上可能需要.通常不是. - [为什么在数组迭代中使用"for ... in"这个坏主意?](/sf/ask/35035311/ -馊主意) (2认同)

Jus*_*rei 13

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

key是"messages",这是一个你需要迭代的数组,如下所示:

    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]);
               }
           }
       }
    }
Run Code Online (Sandbox Code Playgroud)


san*_*ari 11

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

data.messages.forEach(function(message){
    console.log(message)
});
Run Code Online (Sandbox Code Playgroud)

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


Ars*_* KV 9

迭代

方法一: forEach方法

messages.forEach(function(message) {
   console.log(message);
}
Run Code Online (Sandbox Code Playgroud)

方法二: for..of方法

for(let message of messages){
   console.log(message);
}
Run Code Online (Sandbox Code Playgroud)

注意:此方法可能不适用于对象,例如:

let obj = { a: 'foo', b: { c: 'bar', d: 'daz' }, e: 'qux' }
Run Code Online (Sandbox Code Playgroud)

方法二: for..in方法

for(let key in messages){
       console.log(messages[key]);
 }
Run Code Online (Sandbox Code Playgroud)


Hem*_*ari 6

此处提供的所有答案均使用正常功能,但如今,我们的大多数代码在ES6中均使用箭头功能。我希望我的答案能对我们在对象数组上进行迭代时如何使用箭头功能的读者有所帮助

let data = {
      "messages": [{
           "msgFrom": "13223821242",
           "msgBody": "Hi there"
       }, {
          "msgFrom": "Bill",
          "msgBody": "Hello!"
       }]
 }
Run Code Online (Sandbox Code Playgroud)

使用箭头功能对数组执行.forEach

 data.messages.forEach((obj, i) => {
     console.log("msgFrom", obj.msgFrom);
     console.log("msgBody", obj.msgBody);
 });
Run Code Online (Sandbox Code Playgroud)

使用箭头功能在数组上执行.map

 data.messages.map((obj, i) => {
     console.log("msgFrom", obj.msgFrom);
     console.log("msgBody", obj.msgBody);
 });
Run Code Online (Sandbox Code Playgroud)


Tar*_*epp 5

要循环遍历对象数组或仅在 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);
}
Run Code Online (Sandbox Code Playgroud)

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

cars.forEach(function (car) {
    console.log(car.name);
});
Run Code Online (Sandbox Code Playgroud)

他们都输出以下内容:

// Audi
// BMW
// Ferrari
// Mercedes
// Maserati
Run Code Online (Sandbox Code Playgroud)