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

时间:2017-12-22 22:14:37

标签: javascript arrays algorithm

我有一个按升序排序的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);
    }
}

3 个答案:

答案 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属性保持不变:

&#13;
&#13;
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;
&#13;
&#13;

类似的注意事项适用于将数组条目设置为null。它们将不再在条件表达式中作为truthy测试,但尚未被删除。和之前一样,数组的长度将保持不变。

将数组的长度设置为比其现有值短的值会将其截断到位。有许多方法可以找到截断数组的边界位置。我建议选择一个对你来说很自然的,并在目标浏览器中工作。例如。在排序数组上使用forSome可能不符合您的要求:)

&#13;
&#13;
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;
&#13;
&#13;

如果使用splice,请注意,可以在一次调用中删除从边界位置到数组末尾的所有条目,而不是一次删除一个:

&#13;
&#13;
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;
&#13;
&#13;