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

其他回答

你也可以像这样扩展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] 

我应该指出,如果您使用第三方库,扩展内置对象的功能可能会导致问题。在做决定时一定要考虑到这一点。

我今天在尝试制作一个不使用循环的2D数组时发现了这一点。回想起来,加入一个新数组很简单;我尝试映射一个新数组,这不能作为映射跳过空槽。

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

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

新的填充方法更好,当我编码这个我不知道它的存在,我也不知道repeat是es6;我打算写一篇博客,介绍如何将这个技巧与reduce结合起来做一些很酷的事情。

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

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

或者创建值递增的数组

Array.from({长度:5}、(e, i) = >我)/ /[0、1、2、3、4)

使用这个函数:

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