【问题标题】:Combine arrays based on set interval (javascript)根据设置的间隔组合数组(javascript)
【发布时间】:2019-10-14 22:14:06
【问题描述】:

我有一个数组数组,即[[3, 6, 7, 7, 4], [5, 9], [4, 1, 6], [6, 3, 6], [5, 7, 8, 9]]。我希望根据间隔组合这些数组。例如,如果间隔为 2,我想将这些数组中的前两个组合成一个数组,然后将接下来的两个数组组合成下一个数组,然后将第三个两个数组组合成下一个,依此类推。

我一直在搞砸concat,只是不知道如何完成我所追求的。非常感谢任何帮助,在此先感谢!

【问题讨论】:

  • 这个间隔是多少?我没明白你的意思。您能否说明您希望您的示例在转换结束时如何,以便我了解您需要什么?
  • 说间隔i 是 3。这意味着你必须组合元素 0,1 和 2,然后是 3、4 和 5,然后是 6、7 和 8,等等。如果你查看这些数字,您会发现插入Math.floor(x / i) 的前三个将产生 0。接下来的三个将产生 1。接下来的三个将产生 2。以此类推。
  • 这是一种方法:jsfiddle.net/khrismuc/6zxb0a2e
  • @ChrisG 这很完美,正是我所需要的。请在答案中弹出它,我会接受它。非常感谢您的宝贵时间!!!

标签: javascript arrays concat


【解决方案1】:

如果您使用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));

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

      【解决方案3】:

      这是另一个乱七八糟的解决方案:)

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

      【讨论】:

        【解决方案4】:

        一种技术是将其分解为简单的可重用函数:

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

        【讨论】:

        • const flatten (xss) =&gt; 部分有错字
        • @CodeManiac:谢谢。固定的。我真的比任何最后一刻的“修复”都更清楚。将combine 重命名为flatten,我不知何故丢失了=。而且我想我没有测试。
        猜你喜欢
        • 2014-10-05
        • 2021-03-08
        • 1970-01-01
        • 2021-06-20
        • 2018-04-24
        • 1970-01-01
        • 2023-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多