重复数组任意次数(javascript)

比方说,我给了一个数组。 这个数组的长度是3,有3个元素:

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

最后,我将需要检查这个数组是否等于一个具有相同元素的数组,但现在只是两次。 我的新arrays是:

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

我知道我可以使用array.splice()来复制一个数组,但我怎样才能复制它未知的时间? 基本上我想要的是会有影响的东西

 var dupeArray = array*2; 

这是一个相当简洁,非recursion的复制任意数量的数组的方法:

 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] 

这是怎么回事?

前两行使用applymap来创build数组的“n”个拷贝 。

最后一行使用apply 来平滑我们最近生成的数组。

真的,发生了什么事?

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

这里的第一块魔法酱是使用apply() ,它可以将一个数组传递给一个函数,就像它是一个参数列表一样。

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

  • x是被调用的函数
  • y是函数被调用的对象(如果为null ,则使用global
  • z是参数列表

换句话说,它代表: yx(z[0], z[1], z[2],...)

例如

 var arrays = Array.apply(null, new Array(n)); 

和写作一样

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

第二块魔术是使用map() ,它为数组的每个元素调用一个函数,并创build一个返回值列表。

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

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

例如

 var returnArray = [1,2,3].map(function(x) {return x + 1;}); 

会创build数组[2,3,4]

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

最简单的解决scheme往往是最好的:

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

(或使用@UsamaNorman等嵌套循环)。

然而,如果你想要聪明,你也可以重复concat数组到自己:

 function replicate(arr, times) { for (var parts = []; times > 0; times >>= 1) { if (times & 1) parts.push(arr); arr = arr.concat(arr); } return Array.prototype.concat.apply([], parts); } 

你可以做:

 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函数和一些逻辑: http : //www.w3schools.com/jsref/jsref_concat_array.asp

我想你将不得不编写自己的函数,试试这个:

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

一个相当粗略的解决scheme来检查它是否重复…您可以使用模数检查长度的变化:

那么如果可能的话,循环内容并比较每个值直到完成。 如果在结束之前任何时候都不匹配,那么在结束之前或者没有重复或者停止重复。

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

保持简短和甜蜜

 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] 

http://jsfiddle.net/fLo3uubk/