用同一个元素重复多次创建一个数组

625

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

4
可能重复:https://dev59.com/hnM_5IYBdhLWcg3wn0vT - Larry Battle
25个回答

10
在 Node.js REPL 中:
> Array.from({length:5}).map(x => 2)
[ 2, 2, 2, 2, 2 ]

2
Array.from({length: 5}, x => 2); 参考 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Using_arrow_functions_and_Array.from。 - noobninja

6

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

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

这个答案启发


在ES6中,您可以执行"abc".repeat(3) - Janus Troelsen

6
使用此函数:
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']

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

谢谢!在我接受之前,从效率的角度来看,pushconcat哪个更好? - Curious2learn
CONCAT需要检查两个数组,而PUSH只是添加另一个元素,因此我通常希望PUSH更有效率,但对于相同的数据,我认为Guffa的答案很好。 - Diodeus - James MacFarlane
不需要循环,看我的答案。 - Janus Troelsen
@JanusTroelsen,除非你想要一种高效的方法执行此操作,否则不需要循环。你的实现是可以找到的最慢的之一。push()到[]是最快的。 - chrilith

3

试一试这个:

"avinash ".repeat(5).trim().split(" ");

3

今天我试图创建一个二维数组,但不想使用循环。回顾起来,连接一个新数组是很简洁的;我尝试使用映射一个新数组,但由于map跳过空槽位所以无法正常工作。

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

"#"字符可以是任何有效的单个字符。 5是您想要的元素数量的变量。 7是您想要用来填充数组的值。

新的fill方法更好,在编写此代码时,我不知道它的存在,也不知道repeat是es6; 我将写一篇关于使用这个技巧和reduce一起做酷炫事情的博客文章。

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


3
你可以使用Spread Operator和map()函数创建一个包含多个重复元素的数组。
function fillArray(value,len){
       return [...Array(len).keys()].map(x=> value);
   }

2

该函数创建一个由(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]

2

另一个一行代码:

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

2

当我使用类似于数组的数据结构时,我在使用上述方法时遇到了问题。

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

这很好,但可能应该被命名为“cycle”。 - Drenmi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接