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

当前回答

在洛达什,情况没那么糟:

_.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的功能:

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 repeat(arr, len) {
    while (arr.length < len) arr = arr.concat(arr.slice(0, len-arr.length));
    return arr;
}

如果需要重复一个数组,请使用下面的方法。

Array(3).fill(['a','b','c']).flat() 

将返回

Array(9) [ "a", "b", "c", "a", "b", "c", "a", "b", "c" ]

你可以这样做:

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]