重复数组任意次数(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]
这是怎么回事?
前两行使用apply
和map
来创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]