javascript - 按顺序填充数组并添加数组所有元素的最佳方法

标签 javascript arrays ecmascript-6

今天有人问我,你将如何创建一个包含 N 个顺序元素的数组,如 [1,2,3,...,N](应该从 1 开始),其中 N 由用户提供。例如,如果 N=10,则数组将为 [1,2,3,4,5,6,7,8,9,10]。另外,他想对元素求和,所以如果 N=10 那么结果就是 55。

我是这样做的:

console.log(new Array(10).fill(1).map((x,y)=>x+y).reduce((x,y)=>x+y))
.as-console-wrapper { max-height: 100% !important; top: 0; }
.as-console-row{background: #000;color: #fff;}
.as-console-row-code{font-size:24px!important}

我只想问一下解决同样问题的最佳方法是什么,为什么?

最佳答案

如果考虑到执行时间,您仍在寻找“best”解决方案,则以下解决方案比 Nina 发布的解决方案快 55 倍( https://jsfiddle.net/vc1wmk6e/ ):

function range (first, last) {
  var range = new Array(last - first + 1); range[0] = first;
  for (var i = 1; range[i - 1] < last; i++) range[i] = first + i;
  return range;
}

console.log(...range(1, 10));
console.log(range(1, 10).reduce((acc, x) => acc + x));

要知道为什么它比 fill + map 快(大约 4.5 倍),我们需要查看这两个函数的实现以计算它们的时间复杂度.我现在还没有准备好深入研究 JS 源代码,但是 fillmap 都有可能遍历数组元素。在这种情况下,时间复杂度至少为 O(2N),而 range 函数为 O(N)。剩余的额外时间可能来自需要在内存中查找相应代码的函数调用,但这是一个纯粹的假设:-|

关于javascript - 按顺序填充数组并添加数组所有元素的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55128231/

相关文章:

javascript - 使用 java servlet 的 ajax 多输入表单验证不起作用。 Ajax不显示错误

c - 如何交换指针数组中的元素

javascript - 如何检查 Javascript 数组中是否存在属性值?

javascript - 创建对象时,假设非字符串键将使用 toString() 转换为字符串有多安全?

javascript - ES6 React 类构造函数之外的箭头函数的行为

javascript - .getScript() 等同于 MooTools?

javascript - DataTables Ajax 错误 - 无效的 JSON 响应

javascript - 如何在 ES2015 中重写 Window 上的方法

javascript - 在 Vanilla JS 应用程序中是否仍然需要 $document.ready() 的现代等价物?

java - 如何将 byte[] 值转换为十进制?