用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)