将值预置到数组的最有效方法

2022-08-29 23:52:00

假设我有一个大小为(where)的数组,是否有更有效的方法来预置到数组中,不需要O(N + 1)步?NN > 0

在代码中,基本上,我目前正在做的是

function prependArray(value, oldArray) {
  var newArray = new Array(value);

  for(var i = 0; i < oldArray.length; ++i) {
    newArray.push(oldArray[i]);
  }

  return newArray;
}

答案 1

我不确定在big-O方面更有效率,但肯定使用这种方法更简洁:unshift

var a = [1, 2, 3, 4];
a.unshift(0);
// => [0, 1, 2, 3, 4]
console.log({a});

[编辑]

这个jsPerf基准测试表明,至少在几个浏览器中,它的速度要快得多,不管你可能有不同的big-O性能,如果你可以就地修改数组的话。如果你真的不能改变原始数组,那么你可以做一些类似于下面的片段,这似乎并不比你的解决方案快得多:unshift

a.slice().unshift(0); // Use "slice" to avoid mutating "a".

[编辑2]

为了完整起见,可以使用以下函数代替 OP 的示例来利用 Array 方法:prependArray(...)unshift(...)

function prepend(value, array) {
  var newArray = array.slice();
  newArray.unshift(value);
  return newArray;
}

var x = [1, 2, 3];
var y = prepend(0, x);
// x => [1, 2, 3];
// y => [0, 1, 2, 3];
console.log({ x, y });

答案 2

在 ES6 中,您现在可以使用展开运算符创建一个新数组,其中新元素插入到原始元素之前。

// Prepend a single item.
const a = [1, 2, 3];
console.log([0, ...a]);

// Prepend an array.
const a = [2, 3];
const b = [0, 1];
console.log([...b, ...a]);

更新 2018-08-17:性能

我打算这个答案来呈现一种我认为更令人难忘和简洁的替代语法。应该注意的是,根据一些基准测试(请参阅另一个答案),此语法明显较慢。这可能无关紧要,除非您在循环中执行许多这些操作。