使用循环但是有太多的undefines访问嵌套对象?

时间:2017-07-11 15:22:29

标签: javascript arrays object for-in-loop

我正在使用对象文字并尝试访问嵌套数组并循环遍历循环,但它在我的控制台中再次显示59次和5次未定义,但随后显示数组。如何阻止它在控制台中执行undefined?谢谢!

Screenshot of console log

var votingData = {
  candidates: [{
  name: "Harry S. Truman",
  party: "Democratic"
},
{
  name: "Thomas E. Dewey",
  party: "Republican"
},
{
  name: "Strom Thurmond",
  party: "Dixiecrat"
}]

}

for(var candidate in votingData) {
  if(votingData.hasOwnProperty(candidate)) {
    for (let i = 0, j = votingData[candidate].length; i < j; i++) {
    console.log(votingData[candidate][i].name, votingData[candidate]
    [i].party);
   }
 }
}

2 个答案:

答案 0 :(得分:3)

由于for/in只包含一个属性votingData,因此candidates循环导致了问题,因为它不需要。由于只有一个属性,您可以直接访问它,无需循环。

你只需要遍历votingData.candidates属性中的数组,为此,你可以使用标准的计数for循环,你正在做的,或者更好的是,使用 Array.forEach() 循环机制。它更好,因为它让你可以直接访问循环的数组元素,而不需要索引器,并且允许语法更清晰,反过来,这往往会避免这样的错误。

&#13;
&#13;
var votingData = {
  candidates: [{
  name: "Harry S. Truman",
  party: "Democratic"
},
{
  name: "Thomas E. Dewey",
  party: "Republican"
},
{
  name: "Strom Thurmond",
  party: "Dixiecrat"
}],
};

// Just loop through the arrays in the votingData.candidates property
votingData.candidates.forEach(function(candidate) {
  // Now "candidate" is an object, so standard "dot notation" to access
  // any/all properties of the current object is the way to go.
  console.log(candidate.name, candidate.party);
});
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您的第一个for循环和if语句不是必需的。 你可能会得到很多未定义的,因为你有另一个属性在for-in语句中被计算。

如果你愿意的话,这是一个不使用forEach的例子。

编辑

格式化数据以提高可读性

var votingData = {
  candidates: [
    {
      name: "Harry S. Truman",
      party: "Democratic"
    },
    {
      name: "Thomas E. Dewey",
      party: "Republican"
    },
    {
      name: "Strom Thurmond",
      party: "Dixiecrat"
    }
  ],
  not_candidates : []
}

for (let i = 0, j = votingData.candidates.length; i < j; i++) {
  console.log(votingData.candidates[i].name, votingData.candidates[i].party);
}