488

在 Python 中,where[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

26 回答 26

1057

在 ES6 中使用 Array fill()方法

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

于 2015-12-05T11:31:52.587 回答
166
>>> 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]
于 2013-11-10T16:31:53.283 回答
120

你可以试试:

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

更新(2018 年 1 月 6 日)

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

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

注意:检查有关fill(...)from(...)的更多信息以了解兼容性和浏览器支持。

更新(2019 年 5 月 11 日)

另一种方法,不使用fillor from,适用于任何长度的字符串:

Array.apply(null, Array(3)).map(_ => 'abc') // ['abc', 'abc', 'abc']

与上述答案相同。为了完整性而添加。

于 2014-01-22T19:12:52.753 回答
69

你可以这样做:

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;
}
于 2012-09-19T21:34:12.933 回答
64

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

以前都是手动写的才知道这个‍♂️<strong>

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

Array(4).fill(0)  // =>  [0, 0, 0, 0]

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


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


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


❗️使用 .fill() 创建对象和数组时要小心,因为它们是引用类型❗️

这意味着 Javascript 会将所有创建的项目视为同一个对象(如果您想进一步与创建的对象交互,可能会引入意外的错误)

// ❌ Careful when using .fill() with objects and arrays:

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

上面的行有效,但坚持使用 .fill().map() 模式会更安全。像这样:

//  Much better!

Array(3).fill().map(item => ({ value: 2 }))
于 2021-02-05T21:18:09.810 回答
44

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

或创建价值增加的数组

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

于 2017-02-16T06:12:38.607 回答
38

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);
于 2014-07-09T23:09:04.653 回答
36

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

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

将返回

Array(9) [ "a", "b", "c", "a", "b", "c", "a", "b", "c" ]
于 2020-05-13T11:47:46.427 回答
18

[c] * n可以写成:

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

因此对于[2] * 5

Array(6).join(1).split('').map(function(){return 2;})
于 2013-10-10T08:12:03.273 回答
13

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

我应该注意,如果您使用 3rd-party 库,扩展内置对象的功能可能会导致问题。始终在您的决定中权衡这一点。

于 2012-09-19T21:49:07.403 回答
10

在 Node.js REPL 中:

> Array.from({length:5}).map(x => 2)
[ 2, 2, 2, 2, 2 ]
于 2019-09-10T12:21:32.650 回答
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']

受到这个答案的启发

于 2015-04-10T09:54:03.927 回答
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']
于 2019-08-04T09:25:27.337 回答
5

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

于 2012-09-19T21:29:00.447 回答
3

试试这个:

"avinash ".repeat(5).trim().split(" ");
于 2018-04-05T13:57:21.187 回答
3

您可以使用 SpreadOpeator 和 map() 函数创建一个数组,其中同一元素重复多次。

function fillArray(value,len){
       return [...Array(len).keys()].map(x=> value);
   }
于 2020-09-16T02:04:09.860 回答
2

此函数创建一个 (length) 元素数组,其中每个元素等于 (value),只要 (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]
于 2013-04-25T05:20:26.173 回答
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;
};
于 2014-02-14T15:12:03.477 回答
2

另一个单行:

Array.prototype.map.call([]+Array(5+1),function(){ return '2'; })
于 2014-06-23T12:34:47.383 回答
2

我今天在尝试不使用循环制作二维数组时发现了这一点。回想起来,加入一个新数组是很整洁的;我尝试映射一个新数组,但由于 map 跳过了空插槽,因此该数组不起作用。

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

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

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

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

于 2016-07-14T19:56:02.440 回答
2

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

于 2017-10-08T02:28:12.513 回答
2

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

于 2018-07-01T06:40:42.523 回答
0

如果您使用的是 lodash/underscore 之类的实用腰带,您可以这样做:)

let result = _.map(_.times(foo), function() {return bar})
于 2015-07-31T18:37:35.747 回答
0

也可以用作单线:

function repeat(arr, len) {
    while (arr.length < len) arr = arr.concat(arr.slice(0, len-arr.length));
    return arr;
}
于 2017-05-17T03:29:59.927 回答
0

这可能是另一个答案。

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

让 totalCards = [...cards, ...cards, ...cards, ...cards];

于 2020-07-17T19:52:16.487 回答
-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"]
于 2019-01-28T09:24:24.887 回答