根据设置的间隔组合数组(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))

如果您使用 forEachreduce 迭代外部数组,您可以通过将索引除以间隔将其附加到新结果数组的相应内部数组:

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