用JavaScript重复多次创build一个具有相同元素的数组

在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; } 

它在每次迭代中使数组加倍,所以它可以创build一个非常大的数组,并且迭代次数很less。


注意:你也可以使用push来代替concat来改进你的函数,因为concat会在每次迭代时创build一个新的数组。 像这样(就像你可以使用数组一样显示的例子):

 function fillArray(value, len) { var arr = []; for (var i = 0; i < len; i++) { arr.push(value); } return arr; } 

在ES6中使用Array fill()方法

 Array(5).fill(2) //=> [2, 2, 2, 2, 2] 
 >>> Array.apply(null, Array(10)).map(function(){return 5}) [5, 5, 5, 5, 5, 5, 5, 5, 5, 5] 

你可以试试:

 Array(6).join('a').split(''); // returns ['a','a','a','a','a'] (5 times) 

在lodash中并不是那么糟糕:

 _.flatten(_.times(5, function () { return [2]; })); // [2, 2, 2, 2, 2] 

编辑 :甚至更好:

 _.times(5, _.constant(2)); // [2, 2, 2, 2, 2] 

编辑 :甚至更好:

 _.fill(Array(5), 2); 

Array.from({length:5}, i => 1) // [1, 1, 1, 1, 1]

或者增加值创build数组

Array.from({length:5}, (e, i)=>i) // [0, 1, 2, 3, 4]

您也可以像这样扩展数组的function:

 Array.prototype.fill = function(val){ for (var i = 0; i < this.length; i++){ this[i] = val; } return this; }; // used like: var arry = new Array(5)​.fill(2); // or var arry = new Array(5); arry.fill(2); ​console.log(arry);​ //[2, 2, 2, 2, 2] 

我应该注意到,如果您正在使用第三方库,扩展内置对象的function可能会导致问题。 总是权衡这个到你的决定。

[c] * n可以写成:

 Array(n+1).join(1).split('').map(function(){return c;}) 

所以对于[2] * 5

 Array(6).join(1).split('').map(function(){return 2;}) 

没有简单的方法。 你需要做一个循环,并将元素推入数组中。

只要(value)是一个整数或者一个整数的string,这个函数就会创build一个数组,其中每个元素等于(value)。 任何十进制数字将被截断。 如果你想要十进制数,把“parseInt( ”和“ parseFloat(

 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] 

当我使用类似数组时,我遇到了上述方法的问题

 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; }; 

另一个单线:

 Array.prototype.map.call([]+Array(5+1),function(){ return '2'; }) 

我今天发现了这个,试图在不使用循环的情况下制作二维数组。 回想起来,join一个新的arrays是完整的; 我试图映射一个新的数组,这不起作用地图跳过空插槽。

 "#".repeat(5).split('').map(x => 0) 

“#”字符可以是任何有效的单个字符。 5将是你想要的元素数量的variables。 7将是你想要填补你的数组的价值。

新的填充方法更好,当我编码这个我不知道它存在,我也不知道重复是es6; 我将写一篇关于使用这个技巧的博客文章,与reduce一起做很酷的事情。

http://jburger.us.to/2016/07/14/functionally-create-a-2d-array/

如果你需要多次重复一个数组

 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'] 

受到这个答案的启发

如果你正在使用像lodash /下划线这样的有用腰带,你可以这样做:)

 let result = _.map(_.times(foo), function() {return bar}) 

也可以用作单线:

 function repeat(arr, len) { while (arr.length < len) arr = arr.concat(arr.slice(0, len-arr.length)); return arr; } 

改进Vivek的答案 ,这适用于任何长度的string,以填充长度为n的数组:array Array(n+1).join('[string to be repeated][separator]').split('[separator]').slice(0, n)