JavaScript - 截断数组的更有效方法

问题描述 投票:2回答:3

我有一个按升序排序的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);
    }
}
javascript arrays algorithm
3个回答
6
投票
 a.length -= count;

多数民众赞成;)(因为长度不是一个简单的属性,而是一个截断/添加元素(ref)的getter / setter)

或者使用拼接:

 a.splice(-count, count);

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 );

如果阵列很大,可能会稍微(可忽略地)慢,但在旧引擎中有更多的支持。


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"));

类似的注意事项适用于将数组条目设置为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);
© www.soinside.com 2019 - 2024. All rights reserved.