2017-04-21 140 views
1

我见过很多不同的方式来访问对象数组中的值。一个是arr.forEach(Function)在其功能仅仅是一个for...in访问对象数组中的值?

,但林好奇,为什么2个for...in功能不起作用,例如:

[{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }]

(来自freeCodeCamp两者)。

这工作:

function myFunction (item, index) { 

    for(var key in item) { 
    console.log(item[key]) 
    } 
} 

arr.forEach(myFunction(打印所有精值)

但如何走到这不起作用:

for(key in arr) 
{ 
    for(value in key) 
    { 
    console.log(key[value]; 
    } 
} 

我认为这会工作,因为我们可以执行arr [key](并打印出外部循环中的对象,但不能以这种方式访问​​这些值)

编辑:

旁注:是有可能对我打印出每个子键/值对:IE例如在数组索引0到打印出"first: "Romeo"然后"last: "Montague"

+3

'为/ in'不应阵列中使用,因为它们将迭代的对象,包括继承的的所有属性。 'for/in'应该专门用于对象。 –

+0

查看此http://stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-a-bad-idea以获得更多讨论。 –

回答

3

但如何来这样做不起作用:

key因为在这种情况下将是一个string,而不是数组的元素。

您不应该使用for..in遍历数组:MDN

的JavaScript(ECMAScript的)的新版本提供了使用for..of循环,这是完美的遍历数组的能力:

for (var item of arr) { 
    console.log(item); 
} 
+0

啊,好吧...有没有办法让我抓取数组中的子对象,例如,如果我想打印出arr索引1中的第一个键/值对: 就像打印出来一样:'first :“罗密欧”,然后是“上一个:”Montague“' – msmith1114

+0

您可以使用常规的'for(var i = 0; i limit)break'。或者使用'for ..循环并保持一个单独的迭代计数变量。 –

+1

@ msmith1114是的,只需要索引1处的项目并输出其值:'var idx1 = arr [1]; if(idx1){for(var key in idx1){console.log(key,':',idx1 [key]); }} – JLRishe

1

它不工作,因为key在第二for ... in是动态的,你可以同样的理由在第一个示例中,您没有做item.key

0

您需要循环访问数组的索引,然后遍历数组项的键。

var array = [{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], 
 
    key, index; 
 

 
for (index = 0; index < array.length; index++) { 
 
    for(key in array[index]) { 
 
     console.log(array[index][key]); 
 
    } 
 
}