在 JS 中用多个值填充数组的最快方法。我可以将一些模式或函数传递给 JS 中单个值的方法填充吗? [复制]
Posted
技术标签:
【中文标题】在 JS 中用多个值填充数组的最快方法。我可以将一些模式或函数传递给 JS 中单个值的方法填充吗? [复制]【英文标题】:Fastest way to fill an array with multiple value in JS. Can I pass a some pattern or function to method fill insted of a single value in JS? [duplicate] 【发布时间】:2018-08-04 09:32:32 【问题描述】:有什么方法可以创建一个选定大小的数组(例如 10)并立即用一些指定模式(1、2、3、OR 2、4、6 等)的数字填充它JS 中的一个语句?
let arr = new Array(10).fill( (a) => a = 1; return a++; );
console.log(arr); // Should be 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
换句话说,我可以将某个模式或函数传递给填充单个值的方法吗?
【问题讨论】:
Array.from(new Array(10), (_, i) => i) // [0, 1, 2, 3, ...]
最快是for
循环,如果可能的话循环展开esdiscuss.org/topic/…
Array(10).fill(1).map((x, y) => x + y)
【参考方案1】:
实际上,创建范围有更好的习惯用法:a spreaded Array
构造函数:
[...Array(n)]
创建一个包含n
未定义值的数组。要获取0..n-1
,只需选择它的keys
:
[...Array(n).keys()]
对于任意范围,将其提供给map
:
r = [...Array(10)].map((_, i) => i + 1)
console.log(r)
请看这里:Does javascript have a method like "range()" to generate an array based on supplied bounds?
旧答案:
是的,你正在寻找Array.from
:
r = Array.from(length: 10, (_, i) => i + 1);
console.log(r)
这是如何工作的? .from
检查它的第一个参数(可以是任何对象)并选择它的 .length
属性。然后,它从0
迭代到length - 1
并使用两个参数调用第二个参数——一个值(除非第一个参数包含相应的数字属性,否则它是未定义的)和一个索引,它从0...length-1
获取值。在这个例子中,我们有一个函数只返回一个索引 + 1,从而给我们1..length
。
这是一个有用的包装器:
let range = (from, to) => Array.from(length: to - from + 1, _ => from++);
console.log(range(1, 10))
对于 ES5,成语是 Array.apply(null, length:N)
:
r = Array.apply(null, length: 10).map(function(_, i)
return i + 1
)
【讨论】:
ES5 相当于什么?我试过Array.prototype.slice.call(length:10)
但它的行为与Array(10)
相同
@Pavlo:没有,这就是添加它的原因。 :-) 但是 polyfill 很简单。
@T.J.Crowder 我找到了Array.apply(null, Array(10))
@Pavlo:这与Array.from
不同。 (但它确实创建了一个填充有undefined
的数组)。因此,要获得Array.from
,您需要在末尾添加.map
:Array.apply(null, Array(10)).map(function(_, i) return i + 1; );
显然这比真正的polyfill 效率略低,因为它会创建并丢弃两个数组。
@Pavlo:添加...以上是关于在 JS 中用多个值填充数组的最快方法。我可以将一些模式或函数传递给 JS 中单个值的方法填充吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章