【问题标题】:node js, for-loop strange situationnode js,for-loop的奇怪情况
【发布时间】:2018-06-06 19:43:23
【问题描述】:

我试图了解在 node js 中发生在我身上的一种情况,但我无法弄清楚它为什么会发生。

假设我有下一个代码:

let obj = {x:1,y:2};
let arr = [obj, obj, obj, obj, obj], otherArr = [];
for(let i = arr.length - 1; i >=0; i--){
  let objInLoop = arr[i];

  if(objInLoop.x >= 0){   // <= this line throws an exception: Cannot read property 'x' of undefined
    otherArr.push(objInLoop);
    delete arr[i];
  }
}

我得到的错误在代码的第 6 行,异常说明 objInLoop 是 undefined,我无法理解它是怎么回事。

很明显,我在每个循环中都从数组中删除一个元素,但循环从末尾开始,因此每个 delete 不应该影响下一个循环。

当我调试这种情况时,我看到当异常弹出时,i 变量的值小于当前的arr 长度(长度有 1 个元素,i 显示 1在价值中。

这种情况并非一直发生,但它弹出了几次,if 条件中的0 实际上是一个变量,并不总是具有删除元素的真实结果。所有代码都大得多,并且包含许多其他功能和事件。但是“从数组中删除元素”仅出现在我在这里展示的 for 循环部分中。其他异步代码部分具有向数组添加元素的推送功能。

我知道我可以通过向if 添加一个条件来避免它,以确保objInLoop != undefined。但关键是我无法理解这种异常是如何发生的。

【问题讨论】:

  • AFAICT,不太可能是因为delete。这几乎可以肯定是因为您有一个格式错误的对象,没有来自某个地方的 x 属性。它很可能是代码中其他地方的错误,而不是循环中的错误。
  • 但问题不是x,未定义的是arr[i],我也在网上调试过,所以看到长度小于i的情况
  • 也许数组的构造方式有误,里面有空隙?基本上,相当于这样做:let arr = [obj, obj,, obj, obj], otherArr = [];
  • 其实,如果数组之前经过了这个循环,数组中很可能会出现间隙。您可能想使用 splice() 而不是 delete()。

标签: arrays node.js for-loop


【解决方案1】:

如果数组中有间隙,就会发生这种情况。如果您将arr 的分配更改为let arr = [obj, obj,, obj, obj], otherArr = [];,您可以看到这一点。

数组中怎么会有间隙?好吧,可能导致它的一件事是,如果数组之前已经通过循环并删除了一些东西。

let arr = [{}, {}, {}];
console.log(arr[1]); // {}
delete arr[1];
console.log(arr[1]); // undefined
console.log(arr); // [ {}, <1 empty item>, {} ]

如果delete 是您真正想要的,并且如果数组可能不止一次地循环,那么您将需要检查undefined.

或者,如果对象的索引可以更改,您可以使用Array.prototype.splice()

let arr = ['a', 'b', 'c', 'd'];
let i = 2;
arr.splice(i, 1); // remove one item at index i, i is 2, arr[i] is 'c'
console.log(arr); // ['a', 'b', 'd']

或者您可以完全放弃循环并使用Array.prototype.filter()Array.prototype.map()Array.prototype.forEach(),具体取决于您的情况。

【讨论】:

  • 非常感谢。我使用了splice,它解决了我的问题。也许delete 不是删除数组元素的推荐方式。
猜你喜欢
  • 2019-06-27
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2019-10-03
  • 1970-01-01
  • 2014-01-11
相关资源
最近更新 更多