在Python中,[2]是一个列表,以下代码给出以下输出:
[2] * 5 # Outputs: [2,2,2,2,2]
是否存在一种简单的方法来做到这一点与JavaScript数组?
我写了下面的函数来实现它,但是有没有更短或更好的函数呢?
var repeatelem = function(elem, n){
// returns an array with element elem repeated n times.
var arr = [];
for (var i = 0; i <= n; i++) {
arr = arr.concat(elem);
};
return arr;
};
你可以这样做:
function fillArray(value, len) {
if (len == 0) return [];
var a = [value];
while (a.length * 2 <= len) a = a.concat(a);
if (a.length < len) a = a.concat(a.slice(0, len - a.length));
return a;
}
它在每次迭代中将数组加倍,因此它可以用很少的迭代创建一个非常大的数组。
注意:你也可以通过使用push而不是concat来改进你的函数,因为concat每次迭代都会创建一个新数组。如下所示(只是作为如何使用数组的示例):
function fillArray(value, len) {
var arr = [];
for (var i = 0; i < len; i++) {
arr.push(value);
}
return arr;
}
这个函数创建一个长度为(length)的元素数组,只要(value)为整数或整数字符串,每个元素都等于(value)。任何十进制数都将被截断。如果你想要小数,用"parseFloat("替换"parseInt("
function fillArray(length, intValue) {
var vals = (new Array(length + 1)).join(intValue + '|').split('|').slice(0,length);
for(var i = 0; i < length; i += 1) {
vals[i] = parseInt(vals[i]);
}
return vals;
}
例子:
fillArray(5, 7) // returns [7,7,7,7,7]
fillArray(5, 7.5) // returns [7,7,7,7,7]
fillArray(5, 200) // returns [200,200,200,200,200]
>>> Array.apply(null, Array(10)).map(function(){return 5})
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
>>> //Or in ES6
>>> [...Array(10)].map((_, i) => 5)
[5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
你可以试试:
Array(6).join('a').split(''); // returns ['a','a','a','a','a'] (5 times)
更新(01/06/2018):
现在你可以有一组重复的字符。
new Array(5).fill('a'); // give the same result as above;
// or
Array.from({ length: 5 }).fill('a')
注意:查看更多关于fill(…)和from(…)的兼容性和浏览器支持。
更新(05/11/2019):
另一种方法,不使用fill或from,适用于任何长度的字符串:
Array.apply(null, Array(3)).map(_ => 'abc') // ['abc', 'abc', 'abc']
同上面的答案。为了完整而添加。
我有问题与提到的方法,当我使用数组像
var array = ['foo', 'bar', 'foobar'];
var filled = array.fill(7);
//filled should be ['foo', 'bar', 'foobar', 'foo', 'bar', 'foobar', 'foo']
为了得到这个,我使用:
Array.prototype.fill = function(val){
var l = this.length;
if(l < val){
for(var i = val-1-l; i >= 0; i--){
this[i+l] = this[i % l];
}
}
return this;
};
在洛达什,情况没那么糟:
_.flatten(_.times(5, function () { return [2]; }));
// [2, 2, 2, 2, 2]
编辑:更好的是:
_.times(5, _.constant(2));
// [2, 2, 2, 2, 2]
编辑:更好的是:
_.fill(Array(5), 2);
如果你需要多次重复一个数组:
var arrayA = ['a','b','c'];
var repeats = 3;
var arrayB = Array.apply(null, {length: repeats * arrayA.length})
.map(function(e,i){return arrayA[i % arrayA.length]});
// result: arrayB = ['a','b','c','a','b','c','a','b','c']
受到这个答案的启发
我今天在尝试制作一个不使用循环的2D数组时发现了这一点。回想起来,加入一个新数组很简单;我尝试映射一个新数组,这不能作为映射跳过空槽。
"#".repeat(5).split('').map(x => 0)
“#”字符可以是任何有效的单个字符。
5是你想要的元素数量的变量。
7是你想要填充数组的值。
新的填充方法更好,当我编码这个我不知道它的存在,我也不知道repeat是es6;我打算写一篇博客,介绍如何将这个技巧与reduce结合起来做一些很酷的事情。
http://jburger.us.to/2016/07/14/functionally-create-a-2d-array/
使用这个函数:
function repeatElement(element, count) {
return Array(count).fill(element)
}
>>> repeatElement('#', 5).join('')
"#####"
或者是更简洁的版本:
const repeatElement = (element, count) =>
Array(count).fill(element)
>>> repeatElement('#', 5).join('')
"#####"
或者是咖喱口味的:
const repeatElement = element => count =>
Array(count).fill(element)
>>> repeatElement('#')(5).join('')
"#####"
你可以在列表中使用这个函数:
const repeatElement = (element, count) =>
Array(count).fill(element)
>>> ['a', 'b', ...repeatElement('c', 5)]
['a', 'b', 'c', 'c', 'c', 'c', 'c']
如果需要重复一个数组,请使用下面的方法。
Array(3).fill(['a','b','c']).flat()
将返回
Array(9) [ "a", "b", "c", "a", "b", "c", "a", "b", "c" ]