【问题标题】:How to 'repeat' an array n times [duplicate]如何“重复”一个数组n次[重复]
【发布时间】:2019-07-22 22:25:00
【问题描述】:

在python中你可以这样做:

arr = [1,2,3] * 3
print(arr)

输出:

[1,2,3,1,2,3,1,2,3]

在 java 脚本中是否有一种简洁的方法?我能想到的最好的是:

let arr2 = [...arr, ...arr, ...arr]

但如果我想这样做 100 次,那将是不切实际的。在 python 中,我只需将其乘以 100。

【问题讨论】:

  • 您可以使用字符串repeat 方法,使用joinsplit 将数组转换为强数组?
  • @RobinZigmond 对于对象数组会产生问题。
  • 好点@Pointy,由于某种原因,当OP显然在谈论数字时,我在想它好像是一个字符串数组。 (不过,它对数字“有点”工作。不像对象!)
  • Array(100*3).fill().map((v,i) => [1,2,3][i%3])

标签: javascript arrays


【解决方案1】:

你可以这样做:

var repeated = [].concat(... new Array(100).fill([1, 2, 3]));

这将创建一个给定长度的数组(此处为 100)并用要重复的数组填充它([1, 2, 3])。然后将该数组作为参数列表传播到[].concat()

等一下

var repeated = new Array(100).fill([1, 2, 3]).flat();

会短一点。

【讨论】:

  • 我喜欢这个,因为它是一个易于阅读且有意义的单行。来自 python,这对我来说感觉更自然。
  • @Jeto 是的,虽然我承认这让我非常不舒服
  • 不知道效率如何。
  • @MaxWaterman 如果你想对数组的每个元素做一些事情,那本质上是一个线性时间操作。
【解决方案2】:

试试这个:

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

它在每次迭代中将数组翻倍,因此它可以用很少的迭代创建一个非常大的数组。

【讨论】:

  • 这不会产生想要的输出或满足“简洁”的要求。
【解决方案3】:

您可以创建一个具有所需长度的数组并映射值。

var array = [1, 2, 3],
    result = Array.from({ length: 3 * array.length }, (_, i) => array[i % array.length]);

console.log(result);

【讨论】:

  • IMO,这是最有效的,并且似乎等同于 malloc,然后在数组元素上进行单个循环。其他解决方案似乎涉及数组元素上的多个循环。
【解决方案4】:

使用Array.from() 创建一个长度为乘数的数组,其中每一项都包含原始数组。然后使用Array.flat()转换为单个数组:

const multiplyArray = (arr, length) => 
  Array.from({ length }, () => arr).flat()

const arr = [1,2,3]
const arr2 = multiplyArray(arr, 3)

console.log(arr2)

【讨论】:

  • 感谢 Array.from() 方法引起我的注意,以后会派上用场的。
【解决方案5】:

简单明了:

    var n=4; //times //put 100
    var array = [1,2,3];
    var newarray = [];
    while(n--){ var newarray = newarray.concat(array); }
    alert(newarray);

【讨论】:

  • console.log(var); 这应该是console.log(array);,仍然不会产生想要的结果
  • @LucaKiebel 谢谢,已修复。
  • 现在它工作得很好 ;-) 在你总是将数组大小翻倍之前通过 ovwerwriting array
【解决方案6】:

一种快速的方法是加入数组,使用 string.repeat() 重复它,然后拆分它,最后使用 ES6 Spreads

其他答案可能更好。这只是一个简单的单行。

let arr = [1, 2, 3];
let res = [...arr.join("").repeat(3).split("").map(Number)];

console.log(res);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 2011-11-13
    • 2016-04-19
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2017-11-10
    相关资源
    最近更新 更多