我有一个按升序排序的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;
或者相同但使用 splice :
for (var i = length - 1; i >= 0; i--) {
if (a[i] > boundary) {
a.splice(i, 1);
}
}
答案 0 :(得分:6)
a.length -= count;
这就足够了;)(因为长度不是一个简单的属性,而是一个截断/添加元素的getter / setter https://regex101.com/r/qH8sN2/5)
或者使用拼接:
a.splice(-count, count);
答案 1 :(得分:2)
在现代引擎中或使用垫片时,您可以使用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 );
如果阵列很大,可能会稍微(可忽略地)慢,但在旧引擎中有更多的支持。
答案 2 :(得分:1)
不要删除数组末尾的数组条目以截断它。删除数组条目会通过创建稀疏数组将它们从数组中删除:数组的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"));
&#13;
类似的注意事项适用于将数组条目设置为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)
&#13;
如果使用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);
&#13;