假设我有一个数组。这个数组的长度为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;
const duplicateArr = (arr, times) =>
Array(times)
.fill([...arr])
.reduce((a, b) => a.concat(b));
这应该可行。它创建一个大小为您想要重复的次数的新数组。它使用数组的副本填充它。然后使用reduce将所有数组连接成单个数组。
.join()
来替代reduce
。 - kano.join()
输出一个字符串,你是不是想用 flat()
? - Leon Segal最简单的解决方案常常是最好的方案:
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);
}
res = new Array(rl);
,对吧?还有在 for 循环中应该是 i < rl
。不管怎样,我已经点赞了。 - Shashank虽然基础,但对我有用。
var num = 2;
while(num>0){
array = array.concat(array);
num--}
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 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));
这是一种相对简洁的,非递归的方法来复制一个数组任意次数:
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
来创建 一个由 "n" 个副本组成的数组。
最后一行使用 apply
来展开 我们最近生成的数组。
但是,真的发生了什么?
如果你没有使用过 apply 或 map,这段代码可能会让人感到困惑。
这里的第一个神奇部分是使用 apply()
,它可以将一个数组作为参数列表传递给函数。
Apply 使用三个信息: x.apply(y,z)
null
,则使用global
)代码示例:y.x(z[0], z[1], z[2],...)
例如
var arrays = Array.apply(null, new Array(n));
就等同于写作:
var arrays = Array(undefined,undefined,undefined,... /*Repeat N Times*/);
map()
,它对数组中的每个元素调用一个函数并创建返回值列表。x.map(y)
var returnArray = [1,2,3].map(function(x) {return x + 1;});
apply
和map
只是一些高级概念,可能很难指望每个人一眼就能理解。 - sliftyfunction 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]
function replicate(a, n) { return !n ? [] : repeat(a, n-1).concat(a); }
- Bergi我认为你需要编写自己的函数,试试这个:
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;
}
检查重复的一个相对简单的解决方案是...
您可以使用模数检查长度的变化:
然后,如果可能的话,请循环遍历内容并比较每个值,直到完成。如果在结束之前任何时候不匹配,则它要么没有重复,要么在结束之前停止了重复。
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 arr=[1,2,3]; arr.map([].valueOf.bind(arr))
- dandavis