在无序数组上有效替代Array.prototype.splice()?

时间:2015-12-23 05:04:16

标签: javascript arrays

问题

Array.prototype.splice()修改数组,返回已删除的元素。

是否有更有效的方法从数组中删除元素,而不返回该元素,这在功能上是等效的? - 它是否会以同样的方式影响记忆?

var a = [];

a.length = 500;

a.fill(1);

//--------------------
a[250] = a[499];

a.length--;
//-------------------- 

var a = [];

a.length = 500;

a.fill(1);

//--------------------
a.splice(250, 1);
//--------------------

这些数组是否包含相同的元素(尽管有顺序),并占用相同数量的内存?

1 个答案:

答案 0 :(得分:0)

他们远不及等同;即使在那个稀疏阵列中,也要进一步思考......

const arr1 = Array(500).fill();
arr1[arr1.length - 1] = "Bob";

arr1; // 499x undefined, 1x Bob
arr1[250] = arr[499];
arr1.length -= 1;
arr1; // 250x undefined, 1x Bob 248x undefined


// compare the above with
const arr2 = Array(500).fill();
arr2[arr2.length - 1] = "Bob";
arr2.splice(250, 1);
arr2; // 498x undefined 1x Bob


// compare that with
const arr3 = Array(500).fill();
arr3[arr3.length - 1] = "Bob";
const arr4 = arr3.slice(0, 250).concat(arr3.slice(251));
arr3; // 499x undefined 1x Bob
arr4; // 498x undefined 1x Bob


// if you wanted to hand-wind a "splice" which did actually work the way you thought it did,
// you might try soemething like

function splice (arr, start, offset) {
  let i = 0;
  while (start + i + offset < arr.length) {
    arr[start + i] = arr[start + i + offset];
    i += 1;
  }
  arr -= offset;
}

我可能在最后一个函数中有一个错误的错误;我正试图进入休假模式。

此时我还没有其中一个。