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

时间:2012-09-19 21:26:23

标签: javascript arrays repeat

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

26 个答案:

答案 0 :(得分:478)

在ES6中使用Array fill()方法

Array(5).fill(2)
//=> [2, 2, 2, 2, 2]

答案 1 :(得分:131)

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

答案 2 :(得分:63)

你可以尝试:

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

更新(01/06/2018):

现在你可以重复一组字符。

new Array(5).fill('a'); // give the same result as above;
// or
Array.from({ length: 5 }).fill('a')

注意:有关兼容性和浏览器支持的详情,请查看fill(...)from(...)

答案 3 :(得分:49)

你可以这样做:

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

答案 4 :(得分:36)

...和 ​​Array.fill() 来救援!

在认识这个之前都是手动写的??‍♂️


Array(6).fill('?')   =>  ['?','?','?','?','?','?']

Array(3).fill({ value: 2 })   =>  [{ value: 2 },{ value: 2 },{ value: 2 }]

您还可以使用 fill() + map() 轻松创建顺序数组


Array(4).fill('').map((_, i) => i + ' ?')  =>  ['0 ?','1 ?','2 ?','3 ?']


Array(3).fill(' ?').map((flower, i) => i + flower)  =>  ['0 ?','1 ?','2 ?']

答案 5 :(得分:30)

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

或创建值增加的数组

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

答案 6 :(得分:29)

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

答案 7 :(得分:14)

[c] * n可以写成:

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

所以[2] * 5

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

答案 8 :(得分:10)

你也可以像这样扩展数组的功能:

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] 

我应该注意,如果您正在使用第三方库,扩展内置对象的功能可能会导致问题。始终将这一点权衡到你的决定中

答案 9 :(得分:10)

如果需要重复数组,请使用以下内容。

Array.from({length: 3}).fill(['a','b','c']).flat()

将返回

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

答案 10 :(得分: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']

答案 11 :(得分:3)

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

答案 12 :(得分:3)

如果您需要多次重复数组

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

受到this answer

的启发

答案 13 :(得分:2)

另一个单行:

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

答案 14 :(得分:2)

在Node.js REPL中:

> Array.from({length:5}).map(x => 2)
[ 2, 2, 2, 2, 2 ]

答案 15 :(得分:1)

此函数创建一个(长度)元素数组,其中每个元素等于(值),只要(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]

答案 16 :(得分:1)

这可能是另一个答案。

让卡片= [“ A”,“ 2”,“ 3”,“ 4”,“ 5”,“ 6”,“ 7”,“ 8”,“ 9”,“ 10”,“ J” ,“ Q”,“ K”];

let totalCards = [...卡,...卡,...卡,...卡];

答案 17 :(得分:1)

var finalAry = [..."2".repeat(5).split("")].map(Number);
console.log(finalAry);

答案 18 :(得分:1)

我今天在试图制作2D阵列而不使用循环时发现了这一点。回想起来,加入一个新的阵列很整洁;我尝试映射一个新数组,这不适用于地图跳过空插槽。

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

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

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

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

答案 19 :(得分:1)

当我使用像

这样的数组时,我遇到了上述方法的问题
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;
};

答案 20 :(得分:0)

试试这个:

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

答案 21 :(得分:0)

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

答案 22 :(得分:0)

也可以作为单行使用:

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

答案 23 :(得分:0)

如果您使用像lodash / underscore这样的优质皮带,您可以这样做:)

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

答案 24 :(得分:0)

您可以使用SpreadOpeator和map()函数创建一个数组,该数组具有相同的元素重复多次。

function fillArray(value,len){
       return [...Array(len).keys()].map(x=> value);
   }

答案 25 :(得分:-1)

我需要一种方法来重复/循环一个数组(包含n个项)m次。

例如,将(人员)列表分发到一周/一个月。假设我有3个名字,我希望它们在一周内重复出现:

fillArray(["Adam", "Blair", "Curtis"], 7); // returns ["Adam", "Blair", "Curtis", "Adam", "Blair", "Curtis", "Adam"]

function fillArray(pattern, count) {
    let result = [];
    if (["number", "string"].includes(typeof pattern)) {
        result = new Array(5);
        result.fill(pattern);
    }
    else if (pattern instanceof Array) {
        for (let i = 0; i < count; i++) {
            result = result.concat(pattern);
        }
        result = result.slice(0, count);
    }
    return result;
}

fillArray("a", 5);        // ["a", "a", "a", "a", "a"]
fillArray(1, 5);          // [1, 1, 1, 1, 1]
fillArray(["a", "b"], 5); // ["a", "b", "a", "b", "a"]