【问题标题】:JS Arrays — Reorganize 1D Array into 2D Array of N Groups Placing Values SequentiallyJS 数组 — 将 1D 数组重新组织为 N 组的 2D 数组,按顺序放置值
【发布时间】:2020-09-23 02:14:12
【问题描述】:

我已经尝试了一些方法,但我似乎无法提出可行的解决方案...

简而言之,我想创建一个函数来将任意长度的一维数组转换为一个特定长度的新二维数组。一维数组中的每个值都应按顺序放置到每个子数组中,直到指定长度,然后从第一个子数组开始。

输入/期望的输出如下:


function groupArray(arr, numberOfGroups) {
 ...
};

// Input Data
const items = [1, 2, 3, 4, 5, 6, 7];
const size = 3;

console.log(groupArray(items, size));
// Expected Output
// [[1, 4, 7], [2, 5], [3, 6]]

【问题讨论】:

    标签: javascript arrays functional-programming


    【解决方案1】:

    您可以将reminder operator % 与数组的索引和所需大小一起使用,以获得正确的目标数组。

    const
        groupArray = (array, size) => array.reduce((result, value, index) => {
            const target = index % size;
            if (!result[target]) result[target] = [];
            result[target].push(value);
            return result;
        }, []);
    
    console.log(groupArray([1, 2, 3, 4, 5, 6, 7], 3));
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案2】:

      使用嵌套for

      function groupArray(arr, numberOfGroups) {
        var result = []
      
        for (var i = 0; i < numberOfGroups; i++) {
          var subarr = []
      
          for (var j = i; j < arr.length; j += numberOfGroups) {
            subarr.push(arr[j])
          }
      
          result.push(subarr)
        }
      
        return result
      };
      
      // Input Data
      const items = [1, 2, 3, 4, 5, 6, 7];
      const size = 3;
      
      console.log(groupArray(items, size));

      【讨论】:

        【解决方案3】:

        这样的事情也可以做到, 你不需要改变任何输入

        const chunkify = (step, list) => list.reduce(
          ([chunk, rest], item, i) => {
            const pick = i % step === 0;  
        
            return [
              chunk.concat(pick ? item : []),
              rest.concat(pick ? [] : item),
            ];
          },
          [[], []],
        );
        
        const group = (step, list, result = []) => {
          if (!list.length) { return result; }
          
          const [chunk, rest] = chunkify(step, list);
          
          return group(step - 1, rest, [...result, chunk]);
        };
        
        const data = [1, 2, 3, 4, 5, 6, 7];
        const step = 3;
        
        console.log(
          group(step, data),
        );

        【讨论】:

          【解决方案4】:

          有方法next,每次调用都会返回下一个索引,当限制达到numberOfGroups时重置索引0。(在这种情况下,它会像0,1,2,0,1,2... .)

          通过这个方法,可以很方便的推送到对应的output子数组。

          const groupArray = (arr, numberOfGroups) => {
            const output = Array.from({ length: numberOfGroups }, () => []);
            const next = index => index % numberOfGroups;
            arr.forEach((num, i) => output[next(i)].push(num));
            return output;
          };
          
          // Input Data
          const items = [1, 2, 3, 4, 5, 6, 7];
          const size = 3;
          
          console.log(groupArray(items, size));

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-08-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多