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

Cur*_*arn 259 javascript arrays repeat

在Python中,[2]列表在哪里,以下代码给出了这个输出:

[2] * 5 # Outputs: [2,2,2,2,2]
Run Code Online (Sandbox Code Playgroud)

使用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;
};
Run Code Online (Sandbox Code Playgroud)

Nik*_*nen 556

在ES6中使用Array fill()方法

Array(5).fill(2)
//=> [2, 2, 2, 2, 2]
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`fill` 的参数被评估一次,因此`Array(9).fill(someMutable)` 在数组中创建了九个对`someMutable` 的引用(改变一个会改变'them all')。 (13认同)
  • Internet Explorer和Opera尚不支持。 (3认同)
  • Node.js <= 3不支持此功能. (3认同)
  • 对于那些缺乏支持的人来说,有一个现有的[polyfill](https://www.npmjs.com/package/array.prototype.fill)。 (2认同)
  • @Michael您可以使用Array(5).fill([1,2,3])。flat()来实现。请注意,[flat()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat)仍处于试验阶段,浏览器支持很差。 (2认同)

Jan*_*sen 138

>>> 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]
Run Code Online (Sandbox Code Playgroud)

  • 愚蠢的问题,但为什么新的Array(10).map不起作用? (6认同)
  • 使用ES6,可以将其"升级"为"Array(... Array(10)".map(()=> 5)`使用spread运算符或者也可以"Array.from(Array(10))." (()=> 5)` (5认同)
  • 根据[MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/from),您可以像这样:`Array.from({length:10 },()=&gt; 5);` (3认同)
  • blazkovicz,请参阅 [zertosh 对此答案的评论](http://stackoverflow.com/a/13735425/20712) 了解原因。 (2认同)
  • @blazkovicz Array(10)创建一个`lenght = 10`数组,没有任何可枚举的属性.`.map`仅适用于可枚举属性.`.apply`方法获取此数组,并将其映射到`arguments array`(类似数组的对象),以传递给`Array`构造函数.arguments数组不能稀疏,因此缺少的属性设置为`undefined`并变为可枚举.现在我们可以像预期的那样使用`.map` (2认同)

Viv*_*vek 75

你可以试试:

Array(6).join('a').split(''); // returns ['a','a','a','a','a'] (5 times)
Run Code Online (Sandbox Code Playgroud)

更新(01/06/2018):

现在你可以重复一组字符了.

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

注意:有关兼容性和浏览器支持,请查看有关fill(...)(...)的更多信息.

  • 这仅适用于1个字符串,因此它不能完全回答这个问题. (16认同)
  • @AlfonsoVergara:在Javascript中,String是一种原始(值 - 语义)类型; 没有办法让两个字符串引用相同的数据(因为字符串*不是Javascript中的*引用;它们是值).您必须注意对象和列表的引用语义,但不要注意字符串. (3认同)
  • 好的。最短和更简单。 (2认同)
  • +1为简单处理。可惜您不能从中创建一个空字符串数组。除了那个非常聪明的... (2认同)

Guf*_*ffa 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;
}
Run Code Online (Sandbox Code Playgroud)

它在每次迭代中使数组加倍,因此它可以创建一个具有很少迭代的非常大的数组.


注意:您也可以通过使用push而不是改进您的功能concat,因为concat每次迭代都会创建一个新数组.像这样(仅作为如何使用数组的示例):

function fillArray(value, len) {
  var arr = [];
  for (var i = 0; i < len; i++) {
    arr.push(value);
  }
  return arr;
}
Run Code Online (Sandbox Code Playgroud)

  • `Array.from({length:5}).map(x => 2)` (15认同)
  • 使用`arr = new Array(len);`分配所有条目的效率要高得多,然后通过循环中的索引分配给它们,即`arr [i] = value;`.这样你只需支付O(n)而不必在数组增长时继续重新分配数组.一般来说,最好通过在可能的情况下附加来避免增长数组.如果您知道最终尺寸,请使用它. (10认同)
  • @noobninja:很好的解决方案;您应该重新输入它作为答案,以便可以对其进行投票。 (3认同)

Fel*_*aro 47

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

以前在知道这个之前都是手动写的???


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

Array(3).fill({ value: 2 })   =>  [{ value: 2 },{ value: 2 },{ value: 2 }]
Run Code Online (Sandbox Code Playgroud)

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


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


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

Run Code Online (Sandbox Code Playgroud)

  • 我猜有很多 IE 不支持的东西......:) (4认同)

Tho*_*son 31

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

或创建具有增加值的数组

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


Dro*_*ans 29

lodash它不是那么糟糕:

_.flatten(_.times(5, function () { return [2]; }));
// [2, 2, 2, 2, 2]
Run Code Online (Sandbox Code Playgroud)

编辑:更好:

_.times(5, _.constant(2));
// [2, 2, 2, 2, 2]
Run Code Online (Sandbox Code Playgroud)

编辑:更好:

_.fill(Array(5), 2);
Run Code Online (Sandbox Code Playgroud)

  • _.times(length,_.constant(value)) (3认同)

eto*_*xin 29

如果需要重复数组,请使用以下命令。

Array(3).fill(['a','b','c']).flat() 
Run Code Online (Sandbox Code Playgroud)

将返回

Array(9) [ "a", "b", "c", "a", "b", "c", "a", "b", "c" ]
Run Code Online (Sandbox Code Playgroud)

  • Array(3).fill(['a','b','c']).flat() (2认同)

bro*_*ong 15

[c] * n 可以写成:

Array(n+1).join(1).split('').map(function(){return c;})
Run Code Online (Sandbox Code Playgroud)

因此对于 [2] * 5

Array(6).join(1).split('').map(function(){return 2;})
Run Code Online (Sandbox Code Playgroud)

  • 返回["2","2","2","2","2"],而不是[2,2,2,2,2]. (4认同)

Shm*_*dty 10

您还可以像这样扩展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] 
Run Code Online (Sandbox Code Playgroud)

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

  • ES6中添加了[填充方法](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.prototype.fill).所以我不建议你把自己的东西添加到原型中,你会覆盖更快,更强大的版本. (2认同)

noo*_*nja 9

在 Node.js REPL 中:

> Array.from({length:5}).map(x => 2)
[ 2, 2, 2, 2, 2 ]
Run Code Online (Sandbox Code Playgroud)

  • `Array.from({length: 5}, x =&gt; 2);` 参考。[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Using_arrow_functions_and_Array.from](https://developer.mozilla.org/en-US/docs/ Web/JavaScript/Reference/Global_Objects/Array/from#Using_arrow_functions_and_Array.from) (2认同)

Dio*_*ane 6

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


Hen*_*sen 5

如果您需要多次重复数组

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']
Run Code Online (Sandbox Code Playgroud)

受到这个答案的启发


Ken*_*ler 5

使用这个功能:

function repeatElement(element, count) {
    return Array(count).fill(element)
}
Run Code Online (Sandbox Code Playgroud)
>>> repeatElement('#', 5).join('')
"#####"
Run Code Online (Sandbox Code Playgroud)

或者对于更紧凑的版本:

const repeatElement = (element, count) =>
    Array(count).fill(element)
Run Code Online (Sandbox Code Playgroud)
>>> repeatElement('#', 5).join('')
"#####"
Run Code Online (Sandbox Code Playgroud)

或者对于可咖喱的版本:

const repeatElement = element => count =>
    Array(count).fill(element)
Run Code Online (Sandbox Code Playgroud)
>>> repeatElement('#')(5).join('')
"#####"
Run Code Online (Sandbox Code Playgroud)

您可以将此函数与列表一起使用:

const repeatElement = (element, count) =>
    Array(count).fill(element)

>>> ['a', 'b', ...repeatElement('c', 5)]
['a', 'b', 'c', 'c', 'c', 'c', 'c']
Run Code Online (Sandbox Code Playgroud)