变量在for循环内不可见

时间:2018-08-28 07:16:37

标签: javascript arrays scope

我在

这样的JavaScript中有一个for循环
var loopvariable = 0;  
let row = [[]];
for (var key in supplies.food) {
     row[loopvariable][0] = key;
     row[loopvariable][1] = supplies.food[key];
     loopvariable++;
}

为什么会出现以下错误

  

TypeError:行[loopvariable]未定义

2 个答案:

答案 0 :(得分:4)

TL; DR

Object.entries提供您要在其中创建的确切输出:

let row = Object.entries(supplies.food);

详细信息以及您的代码为何不起作用

您仅在row[0]而非row[1]row[2]row[3],...)创建了一个数组,但是您尝试使用循环第二次迭代时位于row[1]处的数组。

最小的变化是将内部数组的创建留给循环主体:

var loopvariable = 0;  
let row = [];                                      // ***
for (var key in supplies.food) {
     row[loopvariable] = [];                       // ***
     row[loopvariable][0] = key;
     row[loopvariable][1] = supplies.food[key];
     loopvariable++;
}

但是我们也可以使用数组初始化器来简化:

var loopvariable = 0;  
let row = [];
for (var key in supplies.food) {
     row[loopvariable++] = [
         key,
         supplies.food[key]
     ];
}

但是,同样,对于这种特定情况,您可以只使用Object.entries

let row = Object.entries(supplies.food);

实时示例:

const supplies = {
  food: {
    water: "3l",
    bread: "2 loaves",
    chocolate: "4 bars"
  }
};
let row = Object.entries(supplies.food);
console.log(row);

Object.entries在所有现代环境中均受支持,并且在较旧的环境中易于填充。

在评论中,您说supplies.food是一个数组。如果是这样,for-in不是遍历它的正确方法(有关详细信息,请参见this answer),但是Object.entries仍然有效,因为数组也是对象(请参见my blog post了解更多):

const supplies = {
  food: [
    "3l water",
    "2 loaves bread",
    "4 bars chocolate"
  ]
};
let row = Object.entries(supplies.food);
console.log(row);

答案 1 :(得分:4)

变量

row[loopvariable]

未初始化。您可以使用默认值,并使用带有保护运算符(logical OR ||)的数组。

row[loopvariable] = row[loopvariable] || [];

一种较短的方法可能只是将新数组推入row,而无需使用附加变量loopvariable

let row = [];
for (var key in supplies.food) {
    row.push([key, supplies.food[key]]);
}