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

IT技术 javascript arrays repeat
2021-01-17 03:04:42

在 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;
};
6个回答

在 ES6 中使用 Array fill()方法

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

请注意,to 的参数fill被评估一次,因此在数组中Array(9).fill(someMutable)创建了九个对的引用someMutable(改变一个会改变“他们全部”)。
2021-03-12 03:04:42
Internet Explorer 和 Opera 尚不支持它。
2021-03-30 03:04:42
对于那些缺乏支持的人,有一个现有的polyfill
2021-04-04 03:04:42
@Michael 你可以用Array(5).fill([1,2,3]).flat(). 请注意,flat()仍然是非常实验性的,浏览器支持很差。
2021-04-04 03:04:42
Node.js <= 3 不支持这个。
2021-04-08 03:04:42
>>> 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]
根据MDN,你可以这样:Array.from({length: 10}, () => 5);
2021-03-14 03:04:42
@blazkovicz Array(10) 创建一个lenght = 10没有任何可枚举属性的数组.map仅适用于可枚举属性。.apply方法接受这个数组,并将它映射到一个arguments array(一个类似数组的对象)传递给Array构造函数。参数数组不能是稀疏的,因此缺失的属性被设置为undefined可枚举。现在我们可以.map像预期的那样使用
2021-03-22 03:04:42
愚蠢的问题,但为什么 new Array(10).map 不起作用?
2021-03-24 03:04:42
使用 ES6,这可以“升级”为Array(...Array(10)).map(() => 5)使用扩展运算符,或者也可以“升级”Array.from(Array(10)).map(() => 5)
2021-03-26 03:04:42
blazkovicz,原因请参阅zertosh 对此答案的评论
2021-03-28 03:04:42

你可以试试:

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(...)的兼容性和浏览器支持。

更新(05/11/2019)

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

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

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

+1 用于简单处理。遗憾的是,您无法从中创建空字符串数组。除了那个非常聪明的...
2021-03-17 03:04:42
好的。最短和更简单。
2021-03-22 03:04:42
这仅适用于 1 个字符的字符串,因此它不能完全回答问题。
2021-03-31 03:04:42
Array(6).join('a').split('a') 给我一个空字符串数组。
2021-04-03 03:04:42
@AlfonsoVergara:在 Javascript 中,String 是一种原始(值语义)类型;没有办法让两个字符串引用相同的数据(因为字符串不是Javascript 中的引用;它们是值)。您必须注意对象和列表的引用语义,而不是字符串。
2021-04-07 03:04:42

你可以这样做:

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;
}
这是后者的优化版本: function fillArray(value, len) { for (let n = [], u = 0; u < len; u++) n.push(value); return n }
2021-03-17 03:04:42
预先分配所有条目的效率更高,使用arr = new Array(len);,然后通过循环中的索引分配给它们,即arr[i] = value;这样你只需支付 O(n) 而不必随着数组的增长而不断重新分配。一般来说,最好尽可能通过追加来避免增长数组。如果您知道最终尺寸,请使用它。
2021-03-23 03:04:42
@noobninja:很好的解决方案;您应该重新输入它作为答案,以便它可以被投票。
2021-03-26 03:04:42
Array.from({length:5}).map(x => 2)
2021-04-02 03:04:42

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

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


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() for this:

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

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

// 👍🏽 Much better!

Array(3).fill().map(item => ({ value: 2 }))
请注意,IE 不支持它,但您可以使用 polyfill。
2021-03-20 03:04:42
我猜有很多 IE 不支持的东西...... :)
2021-04-01 03:04:42