将数组复制任意次数(javascript)

将数组复制任意次数(javascript),javascript,arrays,node.js,Javascript,Arrays,Node.js,假设我得到了一个数组。此数组的长度为3,包含3个元素: var array = ['1','2','3']; 最后,我需要检查这个数组是否等于具有相同元素的数组,但现在只需要检查两次。我的新阵列是: var newArray = ['1','2','3','1','2','3']; 我知道我可以使用array.splice()复制一个数组,但是我怎样才能复制未知的次数呢?基本上,我想要的是能产生 var dupeArray = array*2; 我认为您必须编写自己的函数,请尝试以下方法:

假设我得到了一个数组。此数组的长度为3,包含3个元素:

var array = ['1','2','3'];
最后,我需要检查这个数组是否等于具有相同元素的数组,但现在只需要检查两次。我的新阵列是:

var newArray = ['1','2','3','1','2','3'];
我知道我可以使用array.splice()复制一个数组,但是我怎样才能复制未知的次数呢?基本上,我想要的是能产生

var dupeArray = array*2;

我认为您必须编写自己的函数,请尝试以下方法:

function dupArray(var n,var arr){
var newArr=[];
for(var j=0;j<n;j++)
    for(var i=0;i<arr.length;i++){
        newArr.push(arr[i]);
    }
return newArr;
}
函数dupArray(var n,var arr){
var newArr=[];

对于(var j=0;j一种相当粗糙的溶液,用于检查其重复性。。。 您可以使用模量检查长度的变化:

然后,如果可能的话,循环内容并比较每个值直到完成。如果在任何一点上它在结束前不匹配,那么它要么没有重复,要么在结束前停止重复

if (array2.length % array1.length == 0){
    // It might be a dupe
    for (var i in array2){
        if (i != array1[array2.length % indexOf(i)]) { // Not Repeating }
    }
}
你可以做:

var array = ['1','2','3'];


function nplicate(times, array){
      //Times = 2, then concat 1 time to duplicate. Times = 3, then concat 2 times for duplicate. Etc.
     times = times -1;
     var result = array;

    while(times > 0){
        result = result.concat(array);
        times--;
    }

    return result;
}

console.log(nplicate(2,array));
在同一个数组中搜索n次


使用concat函数和一些逻辑:

最简单的解决方案通常是最好的:

function replicate(arr, times) {
     var al = arr.length,
         rl = al*times,
         res = new Array(rl);
     for (var i=0; i<rl; i++)
         res[i] = arr[i % al];
     return res;
}

以下是一种相当简洁、非递归的方法,可以将阵列复制任意次数:

function replicateArray(array, n) {
  // Create an array of size "n" with undefined values
  var arrays = Array.apply(null, new Array(n)); 

  // Replace each "undefined" with our array, resulting in an array of n copies of our array
  arrays = arrays.map(function() { return array });

  // Flatten our array of arrays
  return [].concat.apply([], arrays);
}

console.log(replicateArray([1,2,3],4)); // output: [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
发生了什么事?

前两行使用
apply
map
创建数组的属性

最后一行使用最近生成的数组
apply

说真的,怎么回事?

如果您没有使用apply或map,代码可能会令人困惑

这里的第一个魔力在于,它的使用使得将数组作为参数列表传递给函数成为可能

应用使用三条信息:
x.Apply(y,z)

  • x是被调用的函数
  • y是调用函数的对象(如果
    null
    ,则使用
    global
  • z是参数列表
就代码而言,它可以翻译为:
y.x(z[0],z[1],z[2],…)

比如说

和写作一样

var arrays = Array(undefined,undefined,undefined,... /*Repeat N Times*/);

第二个魔法是使用它为数组的每个元素调用函数,并创建一个返回值列表

这使用了两条信息:
x.map(y)

  • x是一个数组
  • y是要在数组的每个元素上调用的函数
比如说

将创建数组[2,3,4]


在本例中,我们传入了一个函数,该函数始终返回一个静态值(我们要复制的数组),这意味着此映射的结果是数组的n个副本的列表。

请保持简短

function repeat(a, n, r) {
    return !n ? r : repeat(a, --n, (r||[]).concat(a));
}

console.log(repeat([1,2,3], 4)); // [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]

基本但对我有用

var num = 2;

while(num>0){
array = array.concat(array);
num--}

这应该是可行的。它会创建一个新数组,大小为您要复制它的次数。它会用数组的副本填充数组。然后使用reduce将所有数组合并到一个数组中。

如果您在循环中,则可以用数组长度验证当前循环索引,然后将其内容相乘

let arr = [1, 2, 3];

if(currentIndex > arr.length){ 
  //if your using a loop, make sure to keep arr at a level that it won't reset each loop

  arr.push(...arr);

}
完整示例:

您希望函数比较两个数组还是从给定数组生成新数组?
var arr=[1,2,3];arr.map([].valueOf.bind(arr))
@Trott我有一个比较两个数组元素的函数。我想我要找的是一个从给定数组生成未知次数的新数组的函数。在复制时,您将知道要“复制”多少次它,对吗?为什么你不能多次使用concat/splice/which?最终我需要检查这个数组是否等于一个具有相同元素的数组,但现在只检查了两次。这是否恰好是XY问题的X?换句话说,这是你的最终目标吗?用法如下:myArr=dupArray(5,previousArr);有比嵌套for循环更好的方法来执行此操作!此外,您可能希望编辑答案以包含用法,而不是将其作为注释写入。@slifty:更好的方法,例如?Good call;)--例如Array.concat--例如,谢谢,现在可以了吗?我编辑了它。对于这个错误,很抱歉。但是我知道要做一个函数来连接一个数组n次。当您使用“for vari in array2”语法你正在遍历array2的索引。所以这个答案真的是一团糟。也许在这里使用Array.prototype.forEach会更优雅。使用模是解决这个问题的好主意,所以我喜欢你答案的这一部分。它应该是
res=new Array(rl)
虽然for循环中没有?和
i
。不管怎样,我投了更高的票。更短更甜:
函数复制(a,n){返回!n?[]:重复(a,n-1)。concat(a);}
复杂的代码,但它确实不容易理解它的功能。我个人更喜欢任何人都能立即看到它的功能的代码。我的书中没有简明扼要的要求,也有清晰易懂的要求。这很公平!我只是结合了SO的答案来展示如何查找子问题来构建一个comp答案是正确的。我会详细解释一下。更新后再加上详细的解释。唉,也许
apply
map
永远都是高级概念,很难期望每个人都能一目了然。
function repeat(a, n, r) {
    return !n ? r : repeat(a, --n, (r||[]).concat(a));
}

console.log(repeat([1,2,3], 4)); // [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
var num = 2;

while(num>0){
array = array.concat(array);
num--}
const duplicateArr = (arr, times) =>
    Array(times)
        .fill([...arr])
        .reduce((a, b) => a.concat(b));
let arr = [1, 2, 3];

if(currentIndex > arr.length){ 
  //if your using a loop, make sure to keep arr at a level that it won't reset each loop

  arr.push(...arr);

}