Array.pop()为非emty数组

时间:2016-11-18 10:38:55

标签: javascript

代码

console.log("before .pop()");
console.log(this.selectorWindows);
var selectorWindow = this.selectorWindows.pop();
console.log(selectorWindow);

输出

before .pop()
[37: Object, 38: Object, 39: Object, 41: Object, 42: Object, 43: Object, 44: Object, 47: Object, 48: Object, 49: Object, 51: Object, 52: Object, 53: Object, 56: Object, 57: Object, 59: Object, 60: Object, 62: Object, 63: Object, 64: Object, 66: Object, 67: Object, 68: Object, 70: Object, 71: Object, 74: Object, 75: Object, 76: Object, 78: Object]
undefined

预期的输出

before .pop()
[37: Object, 38: Object, 39: Object, 41: Object, 42: Object, 43: Object, 44: Object, 47: Object, 48: Object, 49: Object, 51: Object, 52: Object, 53: Object, 56: Object, 57: Object, 59: Object, 60: Object, 62: Object, 63: Object, 64: Object, 66: Object, 67: Object, 68: Object, 70: Object, 71: Object, 74: Object, 75: Object, 76: Object]
78: Object

如果数组中有对象,.pop()如何返回undefined?没有异步代码,可以在使用this.selectorWindows时修改.pop()

4 个答案:

答案 0 :(得分:4)

如果那真的是一个数组,那么最新的元素是undefined(我知道已经注释了)。数组在其序列中考虑任何类型的值,这总是取决于其原始长度。如果最新元素为undefined,则它仍然是长度的一部分

有一些方法可以获得最后一个有效值(如果需要,可以删除它):

  • 如果您想要对象,可以过滤该数组的每个元素并复制那些对象。然后你可以正常调用Array#pop,但如果数组是空的,你可以获得undefined;

  • 你可以做一个从结束开始到结束于该数组开始的循环,使其在找到你想要的元素时停止;

  • 等......

例如

arr = this.selectorWindows
var arr, i, item

for (i = arr.length; --i >= 0;) {
    item = arr[i]
    if (item instanceof Object) {
        arr.splice(i, 1)
        break
    }
}

// Now check if the latest item got in loop is an
// object

if (item instanceof Object)
    // Use it

或者您可以过滤该数组:

arr = this.selectorWindows
var arr

filtered = arr.filter(value => value instanceof Object)
var filtered

// Now call Array#pop
filtered.pop()

答案 1 :(得分:0)

您似乎有一个稀疏数组,即包含许多undefined值的数组。 pop()基本上返回(并删除)arr[arr.length - 1]。如果您的数组的length属性(减1)指向undefined的元素,那就是您将获得的内容。

答案 2 :(得分:0)

如果要将数组用作关联数组,请使用对象var myobject = {}

使用myarray[i] = myValue填充数组不是一个好主意,因为你没有其他项之间的项目,这就是你得到undefined的原因

示例: ```    var a = [];    a [2] ='foo';    a.length => 3;    a [30] ='bar';    a.length => 31    a [78] ='嗡嗡声';    a.length => 79;

var b = a.pop();    b => “嗡嗡”声;    a.length => 78    a [77] =>未定义;

```

在[30]和[78] javascript之间填充具有未定义值的数组; 这就是你得到undefined

的原因

然后,如果要正确使用数组,请将对象推入数组或使用地图对象{} 如果你想删除具有更高id的对象,创建一个函数或在侧面使用一个包含id的数组,你对数组进行排序以得到最高的最新id。

答案 3 :(得分:-3)

这可能是一个类似阵列的结构。它仅包含.length属性和通过索引访问,但它不包含.pop()。 有Array.from方法可用于将对象转换为数组。

let selectWinArray = Array.from(this.selectorWindows);

查看更多:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/from