根据设置的间隔组合数组(javascript)
Combine arrays based on set interval (javascript)
我有一个数组数组,即[[3, 6, 7, 7, 4], [5, 9], [4, 1, 6], [6, 3, 6], [5, 7, 8, 9]]
。我希望根据时间间隔组合这些数组。例如,如果interval是2,我想将这些数组的前两个组合成一个数组,然后将接下来的两个数组组合成下一个数组,然后将第三个两个数组组合成下一个,依此类推。
我一直在与 concat
打交道,只是不知道如何完成我所追求的。非常感谢任何帮助,在此先感谢!
试试这个:
let arr = [[3, 6, 7, 7, 4], [5, 9], [4, 1, 6], [6, 3, 6], [5, 7, 8, 9]]
function combine(interval, arr){
let rtrn = [];
let currentArr=[];
for(let i=0;i<arr.length;i++){
if(i>0 && i%interval===0){
rtrn.push(currentArr);
currentArr = [];
}
currentArr = currentArr.concat(arr[i]);
}
rtrn.push(currentArr);
return rtrn;
}
console.log(combine(2,arr));
这是另一个混乱的解决方案:)
test = [[3, 6, 7, 7, 4], [5, 9], [4, 1, 6], [6, 3, 6], [5, 7, 8, 9]];
function concat_arrays(arr, interval) {
concatenated = [];
for (i = 0; i < arr.length; i += interval) {
con = test[i];
for (j = 1; j < interval && i + j < arr.length; j++) {
con = con.concat(arr[i+j]);
}
concatenated.push(con);
}
console.log(concatenated);
}
concat_arrays(test, 3);
一种技术是将其分解为简单的可重用函数:
aperture
将数组分组为给定长度的子数组。 flatten
将一个数组组合成一个数组。把这些放在一起让我们写一个简单的函数:
const aperture = (n, xs) =>
xs .length <= n
? [xs]
: [xs .slice (0, n), ...aperture (n, xs .slice (n))]
const flatten = (xss) =>
xss.flat()
const groupArrays = (n, arrs) =>
aperture (n, arrs) .map (flatten)
const arrs = [[3, 6, 7, 7, 4], [5, 9], [4, 1, 6], [6, 3, 6], [5, 7, 8, 9]]
console .log (groupArrays (2, arrs))
console .log (groupArrays (3, arrs))
如果您使用 forEach
或 reduce
迭代外部数组,您可以通过将索引除以间隔将其附加到新结果数组的相应内部数组:
let arr = [
[3, 6, 7, 7, 4],
[5, 9],
[4, 1, 6],
[6, 3, 6],
[5, 7, 8, 9]
]
// combine using forEach
function combine(a, interval) {
const res = [];
a.forEach((subA, ii) => {
const i = Math.floor(ii / interval); // index of combined array in outer array
res[i] = (res[i] || []).concat(subA); // (create if not existant yet,) append
});
return res;
}
// combine using reduce
function combineR(a, interval) {
return a.reduce((res, subA, ii) => {
const i = Math.floor(ii / interval); // index of combined array in outer array
res[i] = (res[i] || []).concat(subA); // (create if not existant yet,) append
return res;
}, []);
}
console.log(combineR(arr, 3));
我有一个数组数组,即[[3, 6, 7, 7, 4], [5, 9], [4, 1, 6], [6, 3, 6], [5, 7, 8, 9]]
。我希望根据时间间隔组合这些数组。例如,如果interval是2,我想将这些数组的前两个组合成一个数组,然后将接下来的两个数组组合成下一个数组,然后将第三个两个数组组合成下一个,依此类推。
我一直在与 concat
打交道,只是不知道如何完成我所追求的。非常感谢任何帮助,在此先感谢!
试试这个:
let arr = [[3, 6, 7, 7, 4], [5, 9], [4, 1, 6], [6, 3, 6], [5, 7, 8, 9]]
function combine(interval, arr){
let rtrn = [];
let currentArr=[];
for(let i=0;i<arr.length;i++){
if(i>0 && i%interval===0){
rtrn.push(currentArr);
currentArr = [];
}
currentArr = currentArr.concat(arr[i]);
}
rtrn.push(currentArr);
return rtrn;
}
console.log(combine(2,arr));
这是另一个混乱的解决方案:)
test = [[3, 6, 7, 7, 4], [5, 9], [4, 1, 6], [6, 3, 6], [5, 7, 8, 9]];
function concat_arrays(arr, interval) {
concatenated = [];
for (i = 0; i < arr.length; i += interval) {
con = test[i];
for (j = 1; j < interval && i + j < arr.length; j++) {
con = con.concat(arr[i+j]);
}
concatenated.push(con);
}
console.log(concatenated);
}
concat_arrays(test, 3);
一种技术是将其分解为简单的可重用函数:
aperture
将数组分组为给定长度的子数组。 flatten
将一个数组组合成一个数组。把这些放在一起让我们写一个简单的函数:
const aperture = (n, xs) =>
xs .length <= n
? [xs]
: [xs .slice (0, n), ...aperture (n, xs .slice (n))]
const flatten = (xss) =>
xss.flat()
const groupArrays = (n, arrs) =>
aperture (n, arrs) .map (flatten)
const arrs = [[3, 6, 7, 7, 4], [5, 9], [4, 1, 6], [6, 3, 6], [5, 7, 8, 9]]
console .log (groupArrays (2, arrs))
console .log (groupArrays (3, arrs))
如果您使用 forEach
或 reduce
迭代外部数组,您可以通过将索引除以间隔将其附加到新结果数组的相应内部数组:
let arr = [
[3, 6, 7, 7, 4],
[5, 9],
[4, 1, 6],
[6, 3, 6],
[5, 7, 8, 9]
]
// combine using forEach
function combine(a, interval) {
const res = [];
a.forEach((subA, ii) => {
const i = Math.floor(ii / interval); // index of combined array in outer array
res[i] = (res[i] || []).concat(subA); // (create if not existant yet,) append
});
return res;
}
// combine using reduce
function combineR(a, interval) {
return a.reduce((res, subA, ii) => {
const i = Math.floor(ii / interval); // index of combined array in outer array
res[i] = (res[i] || []).concat(subA); // (create if not existant yet,) append
return res;
}, []);
}
console.log(combineR(arr, 3));