nodejs声明具有动态大小的对象数组

时间:2019-02-03 13:03:08

标签: node.js

这是我声明对象数组的方式:

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:'' }];

但是,这当然是不可行的,因为我不知道我的数组大小应该是多少。那么实际上我应该如何声明可以包含对象动态大小的对象数组?

3 个答案:

答案 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整个对象。相反,如果您要设置对象的_idnames属性,该属性可能已经存在不同的键(例如地址),则应检查该对象是否存在:

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
        });
    }
}

注意::由于我没有真正从代码中得到您的意图,因此迭代逻辑可能会发生变化。 “添加项目到错误中”部分还是不错的。