如何在JavaScript中找到第一个未定义的数组元素并填充它?

3
如果数组中添加和删除条目(不是推送/弹出),那么扫描并找到第一个未定义元素的最佳方法是什么,以便可以将其设置为新值?

在插入时检查 undefined -_- ..然后你就可以过上没有 undefined 的生活了。 - Anik Islam Abhi
你能展示一下数组长什么样子吗? - RRP
相关:如何知道数组中是否有任何已定义的元素?(任何不是未定义的元素) - Todd
6个回答

3
如果数组中包含空洞,在使用findIndex时,您可以像这样找到第一个空洞:
[1, 2,, 4, 5].findIndex(Object.is.bind(null, undefined))

indexOf 会忽略空洞。因此

[1, 2,, 4, 5].indexOf(undefined)

始终返回-1


我用长度为4的数组进行了测试,但是由于其内容仅为“undefined”,在这种情况下它无法工作,例如使用new Array(4)创建的数组。(在Angular 5演示应用程序中进行了测试) - HDJEMAI

1
假设我们对数组的操作没有任何先前的了解,最快的方法就是线性地遍历整个数组。
var arr = [1, 2, , 4];

for (var i = 0; i < arr.length; i++) {
  if (typeof arr[i] === 'undefined') {
    arr[i] = 'foo';
    break;
  }
}

或者我们可以使用类似以下方式来跟踪被删除的内容

var earliestRemoved;

if (newRemoved < earliestRemoved || !earliestRemoved) {
  earliestRemoved = newRemoved;
}

0
回顾过去的4.3年,如果我现在是数组的所有者,我会创建一个包含两个数组的对象,第二个数组仅包含已清除的索引(可能在类中管理)。因此,始终具有清晰的知识和未定义的内容,以避免线性迭代数组。

0

我想最简单的方法就是使用 Array.indexOf 来查找第一个 undefined 元素的索引。


indexOf 忽略空洞。所以不行。 - user339222

0

2021

现在你可以安全地使用:

myArray.findIndex((element) => (typeof element === "undefined"));

0

今天我也遇到了同样的问题,这是我的解决方案。

这完全取决于你具体的问题。我的问题是:

  • 我有一个数组instances[],其中包含对象;
  • 其中一些方法在其他地方注册为回调函数;
  • 有时我需要从数组中删除某些实例;
  • 有时我需要添加新实例;

问题在于,我不能只简单地切割数组,因为它会使所有的回调函数失效。好吧,我可以把它们留在数组中并忘记它们,在末尾添加新元素。但这很糟糕。它会泄漏内存。

所以我想到了一个主意,在删除元素的位置上制造“洞”,然后重复使用这些“洞”来添加新元素。

因此问题就变成了“如何在数组中找到未定义的元素?”。

这里有人建议使用array.indexOf(undefined)——不幸的是,由于某种原因,这行不通。

但是,如果在你的情况下使用null0是可以的,那么它将起作用。

以下是一个示例:

var A = [1,1,1,1, , ,0,0,null,1,1];
A.indexOf(undefined);   // output: -1 (doesn't work)
A.indexOf(0);           // output: 6
A.indexOf(null);        // output: 8

希望这会有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接