如果数组中添加和删除条目(不是推送/弹出),那么扫描并找到第一个未定义元素的最佳方法是什么,以便可以将其设置为新值?
findIndex
时,您可以像这样找到第一个空洞:[1, 2,, 4, 5].findIndex(Object.is.bind(null, undefined))
indexOf
会忽略空洞。因此
[1, 2,, 4, 5].indexOf(undefined)
始终返回-1
。
new Array(4)
创建的数组。(在Angular 5演示应用程序中进行了测试) - HDJEMAIvar 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;
}
我想最简单的方法就是使用 Array.indexOf
来查找第一个 undefined
元素的索引。
indexOf
忽略空洞。所以不行。 - user339222现在你可以安全地使用:
myArray.findIndex((element) => (typeof element === "undefined"));
今天我也遇到了同样的问题,这是我的解决方案。
这完全取决于你具体的问题。我的问题是:
instances[]
,其中包含对象;问题在于,我不能只简单地切割数组,因为它会使所有的回调函数失效。好吧,我可以把它们留在数组中并忘记它们,在末尾添加新元素。但这很糟糕。它会泄漏内存。
所以我想到了一个主意,在删除元素的位置上制造“洞”,然后重复使用这些“洞”来添加新元素。
因此问题就变成了“如何在数组中找到未定义的元素?”。
这里有人建议使用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
希望这会有用。
undefined
-_- ..然后你就可以过上没有undefined
的生活了。 - Anik Islam Abhi