2013-10-22 143 views
33

我通過以下努力循環:JavaScript通過對象數組循環?

{ 
    "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]

任何想法即時做錯了什麼?

+1

'的console.log(OBJ,道具)的自身特性';' – zerkms

+3

[你一般要嘗試避免爲'Array'使用'for..in'。](http:// stackoverflow。com/questions/500504/why-is-using-for-in-with-array-iteration-such-a-bad-idea) –

+0

不使用for..in與數組唯一可信的原因是屬性可能不按預定順序退回。否則,在任何其他對象上使用for..in(意外的屬性,來自'[[Prototype]]的屬性等等)都沒有比這更好或更差的了。 – RobG

回答

67

看樣子你可能只是錯過了data"messages"屬性,因此該循環很可能迭代根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]; 
    // ... 
} 
+0

非常感謝幫助我更改爲常規循環以及!儘快接受。 – Alosyius

+1

他爲什麼要考慮使用正常的'for'循環? –

+1

@TravisHeeter'for..in'將數組視爲一個普通對象,按照不保證的順序迭代所有可枚舉的鍵,而不僅僅是其索引'0'到'length - 1'。有時候,這實際上可能是需要的。通常不是。 - [爲什麼在數組迭代中使用「for ... in」是個壞主意?](https://stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-a -bad-idea) –

9

在您的腳本中,數據是您的整個對象。

關鍵是「消息」,這是你需要這樣來遍歷數組:

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

引用包含一個或多個對象,即在某事的括號這樣 {消息一切單個陣列的內容:[{「一」:1 ,「b」:2}]},只需在查詢中加入[0]即可得到第一個數組元素

eg 消息[0]將引用對象{「a」:1,「b」:2} ,而不僅僅是消息,它將引用整個數組{[「a」:1,「b」:2 }]

從那裏你可以使用結果作爲典型的對象,並使用Object.keys來獲得「a」和「b」。

1

建議for循環是相當好的,但你必須檢查與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]); 
 
    }); 
 
});