我应该如何按索引顺序迭代稀疏数组?

2023-11-26

我有一个稀疏数组,其内容不能保证按索引顺序插入,但需要按索引顺序迭代。要迭代稀疏数组,我知道您需要使用 for..in 语句。

然而,根据本文:

不保证 for...in 将以任何特定顺序返回索引

But 像这样的计算器问题建议虽然不能保证对象属性顺序,但数组顺序是:

JavaScript 中不保证对象中的属性顺序,您需要使用数组。

I 测试了这个在最新版本的 Chrome、Firefox 和 IE 中。

<ol id="items"></ol>
var list = [];

function addItem(index) {
    list[index] = { idx : index };
}

var insertOrder = [ 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15 ];

for ( var i = 0; i < 15; i++ ) {
    addItem(insertOrder[i]);
}

for(var item in list) {
    $("#items").append("<li>" + list[item].idx + "</li>");
}

所有这些似乎都遵循索引顺序,所以我可以相信情况总是如此吗?否则,我如何最好地按索引顺序获取它们?


MDN有你原来问题的答案:

注意:for..in 不应该用于迭代索引顺序很重要的数组。

数组索引只是具有整数名称的可枚举属性,其他方面与一般对象属性相同。不保证 for...in 将以任何特定顺序返回索引,并且它将返回所有可枚举属性,包括具有非整数名称的属性和继承的属性。

你不必使用for..in迭代稀疏数组,你应该绝对避免这样做如果可以的话。

你可以只使用.forEach:

list.forEach(function (el) {  // add a second parameter if you need the indices
    $("#items").append($("<li>").text(el.idx));
});

forEach 被定义为按索引顺序迭代并且仅包含数组中存在的元素:

forEach对数组中存在的每个元素按升序执行一次提供的回调。对于已删除或消除的索引,不会调用它。但是,它是针对存在且值未定义的元素执行的。


如果您的目标环境不支持forEach,您可以使用以下内容或该 MDN 页面上提供的垫片:

for (var i = 0; i < list.length; i += 1) {
    if (i in list) {
        $("#items").append($("<li>").text(list[i].idx));
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该如何按索引顺序迭代稀疏数组? 的相关文章

随机推荐