我在
这样的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]未定义
答案 0 :(得分:4)
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]]);
}