这是我声明对象数组的方式:
let arrayOfObjects = [{ _id:0, names:'' }];
我想分配如下值:
for (var i = 0; i < kelasList.length; i++){
for (var j = 0; j < absentees[i].length; j++){
arrayOfObjects[i]._id = absentees[i][j]._id
arrayOfObjects[i].names = absentees[i][j].firstName + " " + absentees[i][j].lastName
}
}
运行上面的代码将返回
UnhandledPromiseRejectionWarning: TypeError: Cannot set property '_id' of undefined at line
基本上指向该行
arrayOfObjects[i]._id
但是如果我写
,它将毫无问题地分配值。arrayOfObjects[0]._id
代替
arrayOfObjects[i]._id
我的假设是let arrayOfObjects = [{ _id:0, names:'' }];
将创建一个对象数组,因此我可以使用以下方式访问/设置其值
arrayOfObjects[i]._id
但是似乎let arrayOfObjects = [{ _id:0, names:'' }];
这里只会创建一个对象数组。因此,当前我要传递更多值,我需要将其声明为
let arrayOfObjects = [{ _id:0, names:'' },{ _id:0, names:'' },{ _id:0, names:'' },{ _id:0, names:'' },{ _id:0, names:'' }];
但是,这当然是不可行的,因为我不知道我的数组大小应该是多少。那么实际上我应该如何声明可以包含对象动态大小的对象数组?
答案 0 :(得分:1)
您可以简单地检查数组中是否已存在元素,如果不存在,则创建它。
let arrayOfObjects = [];
for (var i = 0; i < kelasList.length; i++) {
for (var j = 0; j < absentees[i].length; j++) {
if (!arrayOfObjects[i]) {
arrayOfObjects[i] = {
_id: 0,
names: ''
};
}
arrayOfObjects[i]._id = absentees[i][j]._id
arrayOfObjects[i].names = absentees[i][j].firstName + " " + absentees[i][j].lastName
}
}
答案 1 :(得分:1)
通过设置arrayOfObjects[i]._id
,您可以在已经存在的对象_id
上设置属性arrayOfObjects[i]
。但是对于i> = 1,该对象不存在。
相反,您需要在循环中设置整个对象:
for (var i = 0; i < kelasList.length; i++){
for (var j = 0; j < absentees[i].length; j++){
arrayOfObjects[i] = {
_id: absentees[i][j]._id,
names: absentees[i][j].firstName + " " + absentees[i][j].lastName}
}
}
这将很好地工作,但是将替换索引为i
的整个对象。相反,如果您要设置对象的_id
和names
属性,该属性可能已经存在不同的键(例如地址),则应检查该对象是否存在:
for (var i = 0; i < kelasList.length; i++){
for (var j = 0; j < absentees[i].length; j++){
let id = absentees[i][j]._id;
let names = arrayOfObjects[i].names = absentees[i][j].firstName + " " + absentees[i][j].lastName;
if(arrayOfObjets[i]){
arrayOfObjects[i]._id = id;
arrayOfObjects[i].names = names;
}else{
arrayOfObjects[i] = {
_id: absentees[i][j]._id,
names: absentees[i][j].firstName + " " + absentees[i][j].lastName
}
}
}
}
您的代码有最后一个问题。您要遍历 i ,然后遍历 j ,并设置arrayOfObjects[i]
。这意味着您的双循环基本上与以下内容相同:
for (var i = 0; i < kelasList.length; i++){
let lastAbsentee = absentees[i][absentees[i].length-1];
arrayOfObjects[i]._id = lastAbsentee._id
arrayOfObjects[i].names = lastAbsentee.firstName + " " + lastAbsentee.lastName
}
确定要执行此操作吗?我会以某种方式对此表示怀疑。
答案 2 :(得分:1)
arrayOfObjects
的大小为1
,但是您在arrayOfObjects[i]
之后查看i === 0
,此行为导致undefined
的行为还没有物品。for
循环中,您还在arrayOfObjects[i]
上多次覆盖(为了精确起见,j
次)。尝试使用此
let arrayOfObjects = [];
for (var i = 0; i < absentees.length; i++) {
for (var j = 0; j < absentees[i].length; j++) {
arrayOfObjects.push({
_id: absentees[i][[j]._id,
names: absentees[i][j].firstName + " " + absentees[i][j].lastName
});
}
}
注意::由于我没有真正从代码中得到您的意图,因此迭代逻辑可能会发生变化。 “添加项目到错误中”部分还是不错的。