我有一个稀疏数组;也就是说,一些元素已经delete
d。从中间不断添加和删除元素,因此非常大且非常稀疏。
在某些时候,每个元素都是undefined
,但length
不会为0 - 所以它是空的,但它并没有表达出来。我怎样才能检查是否发生了这种情况?
我能想到的最好的事情就是遍历整个怪物并检查它们是否全部undefined
。但这对我的申请来说效率太低了。
答案 0 :(得分:2)
我能想到的两种解决方案。两者都需要对您与阵列的交互进行一些修改。
如果您只是保留一个表示数组中实际存在的元素数量的计数器,那么空白检查仅仅是比较。
var n = 0;
// Adding something to the array:
myArr[2] = somethingDefined;
n ++;
// Removing from the array:
delete myArr[2];
n --;
// Check if empty
if(n == 0) {
console.log("myArr is empty.");
}
splice
代替delete
splice
实际上会修改数组,而不是将值设置为undefined
。例如:
myArr.splice(2, 1); // Get rid of myArr[2]
这会改变数组并更改.length
,以便您可以轻松检查数组的实际长度。请注意splice
效率较低(并且考虑到效率,第一种解决方案可能更适用)。
答案 1 :(得分:2)
你可以使用数组方法 some ,当它遇到任何非虚假值时退出:
a.some(Boolean);
//如果数组没有真值,则返回false
或者,如果false是可能的值,请检查不是=== undefined:
a.some(function(itm){
return itm !==undefined;
});
答案 2 :(得分:1)
虽然这可能不是最有效的,但它的确非常简洁:
Object.keys(myArr).length === 0
它可能适用于性能较低的应用程序。
答案 3 :(得分:0)
您可以使用对拼接的调用来模拟删除列表:
myArr.splice(indexToRemoveAt,nubmerOfElementsToRemove);
所以对于你的用例:
myArr.splice(indexToRemoveAt,1)
答案 4 :(得分:0)
为我工作sparseArray.size()== 0