我有一个按升序排序的int数组,我想根据特定的边界从尾部删除数组项。在我的情况下截断数组的更好方法是什么?考虑下一段代码片段:
var a = [1, 2, 3, 4];
var length = a.length;
var boundary = 2;
var count = 0;
for (var i = length - 1; i >= 0; i--) {
if (a[i] > boundary) {
a[i] = null; // or delete a[i] ???
count++;
}
}
a.length -= count;
或者相同但使用拼接:
for (var i = length - 1; i >= 0; i--) {
if (a[i] > boundary) {
a.splice(i, 1);
}
}
a.length -= count;
多数民众赞成;)(因为长度不是一个简单的属性,而是一个截断/添加元素(ref)的getter / setter)
或者使用拼接:
a.splice(-count, count);
在现代引擎中,或使用垫片,您可以使用Array.prototype.findIndex:
var a = [1, 2, 3, 4];
var boundary = 2;
a.length = a.findIndex( x => x > boundary );
console.log( a );
由于你的数组是排序的,你也可以使用Array.prototype.filter:
var a = [1, 2, 3, 4];
var boundary = 2;
a = a.filter( x => x <= boundary );
console.log( a );
如果阵列很大,可能会稍微(可忽略地)慢,但在旧引擎中有更多的支持。
不要删除数组末尾的数组条目以截断它。删除数组条目会通过创建稀疏数组将它们从数组中删除:数组的length
属性保持不变:
var a = [1,2,3,4];
console.log( "a.length %s", a.length);
delete a[3];
console.log( "a[3] after deletion: %s", a[3]);
console.log( "a.length after deletion %s", a.length);
console.log( "a[3] still exists: %s", a.hasOwnProperty("3"));
类似的注意事项适用于将数组条目设置为null
。它们将不再在条件表达式中作为truthy测试,但尚未被删除。和之前一样,数组的长度将保持不变。
将数组的长度设置为比其现有值更短的值将截断它。有许多方法可以找到截断数组的边界位置。我建议选择一个对你来说很自然的,并在目标浏览器中工作。例如。在排序的数组上使用forSome
可能不符合您的要求:)
var a = [1,2,3,4];
var boundary = 2;
a.some(
(c,i) => {
if( c > boundary)
{ a.length = i;
return true;
}
}
);
console.log( a)
如果使用splice
,请注意,可以在一次调用中删除从边界位置到数组末尾的所有条目,而不是一次删除一个:
var a = [1,2,3,4];
var boundary = 2;
for( var i = a.length-1; a[i]>boundary; --i) {} // linear search
a.splice(i+1);
console.log(a);