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

如何在javascript中找到第一个未定义的数组元素来填充它?,javascript,Javascript,如果在数组中添加和删除条目(不是推送/弹出),那么扫描和查找第一个未定义元素的最佳方式是什么,所以可以用一个新的值来设置它?我想最简单的方法是找到第一个未定义的元素的索引。假设我们事先不知道在数组上执行的操作,最快的方法是简单地线性遍历整个数组 var arr = [1, 2, , 4]; for (var i = 0; i < arr.length; i++) { if (typeof arr[i] === 'undefined') { arr[i] = 'foo';

如果在数组中添加和删除条目(不是推送/弹出),那么扫描和查找第一个未定义元素的最佳方式是什么,所以可以用一个新的值来设置它?

我想最简单的方法是找到第一个
未定义的
元素的索引。

假设我们事先不知道在数组上执行的操作,最快的方法是简单地线性遍历整个数组

var arr = [1, 2, , 4];

for (var i = 0; i < arr.length; i++) {
  if (typeof arr[i] === 'undefined') {
    arr[i] = 'foo';
    break;
  }
}
var-arr=[1,2,4];
对于(变量i=0;i
或者我们可以用这样的方法跟踪被删除的内容

var earliestRemoved;

if (newRemoved < earliestRemoved || !earliestRemoved) {
  earliestRemoved = newRemoved;
}
var-earliestRemoved;
如果(新删除
如果数组中包含具有
findIndex
的孔,则可以找到第一个如下所示的孔:

[1, 2,, 4, 5].findIndex(Object.is.bind(null, undefined))
indexOf
将忽略孔。所以

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

总是返回
-1

今天我有同样的问题,下面是我的看法

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

  • 我有一个数组
    实例[]
    ,其中包含对象
  • 其中一些方法在别处注册为回调
  • 有时我确实需要从数组中删除一些实例
  • 有时我需要添加新实例
问题是我不能只拼接一个数组,因为它会使我所有的回调注册无效。我可以把它们留在数组中,然后忘记,在最后添加新元素。但是。。。。糟糕。它正在泄漏内存

所以我有了一个想法,在数组中制作“孔”来代替移除的元素,然后将这些孔重新用于新元素

因此,问题“如何在数组中查找未定义的元素?”

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

但是,如果在您的情况下可以使用
null
0
,那么它将起作用

下面是一个例子:

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

希望这会有用。

回顾我4.3年的历史,我现在要做的是,因为我是数组的所有者,所以我要创建一个包含两个数组的对象,第二个数组只包含被清除的索引。(问题是在课堂上管理它)。因此,始终要清楚地知道什么是未定义的。 这是为了避免线性遍历数组。

2021 现在,您可以安全地使用:

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

在插入过程中选中
undefined
。\uu-…然后你就可以生活
undefined
自由生活你能展示一下数组的样子吗相关:如何知道数组中是否有任何已定义的元素?(任何未定义的)
indexOf
忽略孔。没有。我用一个长度为4的数组测试了它,但是只有
未定义的
值作为内容,在这种情况下它不起作用,例如使用
新数组(4)
创建的数组。(在angular 5演示应用程序中测试)