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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建一个具有相同元素重复多次的数组相关的知识,希望对你有一定的参考价值。

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

如果您需要多次重复数组:

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

另一答案

另一个单线:

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

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

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

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

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

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

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

另一答案

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

如果你正在使用像lodash / underscore这样的实用带,你可以这样做:)

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's answer,这适用于任何长度的字符串,以填充长度为n的数组:Array(n+1).join('[string to be repeated][separator]').split('[separator]').slice(0, n)

另一答案

试试这个:

"avinash ".repeat(5).trim().split(" ");
另一答案

我需要一种方法来重复/循环一个数组(有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"]
另一答案

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);
另一答案

[c] * n可以写成:

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

所以对于[2] * 5

Array(6).join(1).split('').map(function(){return 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] 

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

另一答案

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

以上是关于创建一个具有相同元素重复多次的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在类中定义具有n个元素的数组[重复]

多次引用数组中的元素并将该元素分配给变量[重复]

在C#中填充一个数组[重复]

有没有办法使用相同的布局动态创建片段并向它们显示数据?

具有相同功能的活动和片段

如何从多个数组中复制不重复的元素