假设我有一个大小为N(其中N > 0)的数组,有没有一种更有效的方法来预处理数组,而不需要O(N+1)步?

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

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

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

  return newArray;
}

推荐答案

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

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

[Edit]

jsPerf benchmark表明,unshift在至少两种浏览器中的速度都相当快,而不管可能的大O性能如何.if您可以在适当的位置修改array.如果你真的不能改变原来的数组,那么你可以做一些类似下面的代码片段的事情,这似乎不会比你的解决方案快多少:

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

[Edit 2]

为完整起见,可以使用以下函数代替OP的示例prependArray(...)来利用Array 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 });

Javascript相关问答推荐

Next.js Next/Image图像隐含性有任何类型-如何修复?

如何访问Json返回的ASP.NET Core 6中的导航图像属性

如何在使用fast-xml-parser构建ML时包括属性值?

有条件的悲剧

Phaser框架-将子对象附加到Actor

react/redux中的formData在expressjs中返回未定义的req.params.id

为什么这个JS模块在TypeScript中使用默认属性导入?""

如何修复我的js构建表每当我添加一个额外的列作为它的第一列?

如何修复(或忽略)HTML模板中的TypeScript错误?'

如何在 cypress 中使用静态嵌套循环

使用Nuxt Apollo在Piniastore 中获取产品细节

如何使用JS创建一个明暗功能按钮?

如何 for each 输入动态设置输入变更值

如何在Press上重新启动EXPO-AV视频?

从逗号和破折号分隔的给定字符串中查找所有有效的星期几

在Odoo中如何以编程方式在POS中添加产品

处理app.param()中的多个参数

为什么NULL不能在构造函数的.Prototype中工作

使用onClick单击子元素时,使用交点观察器的关键帧动画意外运行

CSS网格使页面自动滚动