【问题标题】:Get data from each array of array with sequence output从具有序列输出的每个数组数组中获取数据
【发布时间】:2020-12-31 13:55:17
【问题描述】:

我正在尝试获取每个数组数组的序列索引,就像我有一个数组元素并且 5 个数组有多个元素,我想获取每个数组的第一个索引,然后是第二个等等。

下面是我的数组数据

const arrData = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]];

和我的预期输出[1,3,12,9,2,8,13,10,4,7,6]

给我一​​些解决方案来解决我的问题

【问题讨论】:

    标签: javascript node.js lodash underscore.js


    【解决方案1】:

    以下可能有效:

    const src = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]],
    
          pickByOne = arr => {
            const result = [],
                  {length} = arr.flat()
            while(result.length < length){
              for(a of arr){
                a.length && result.push(a.shift())
              }
            }
            return result
          }
          
    console.log(pickByOne(src))

    【讨论】:

      【解决方案2】:

      您也可以使用lodash 中的zip。由于该函数采用一系列参数并且您有一个数组,因此您需要使用 ... 展开数组

      const _ = require("lodash");
      const arrData = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]];
      const z =  _.zip(...arrData)
      

      这将为您提供以下结果:

      [
        [ 1, 3, 12, undefined, 9 ],
        [ 2, 8, 13, undefined, 10 ],
        [ 4, 7, undefined, undefined, undefined ],
        [ 6, undefined, undefined, undefined, undefined ]
      ]
      

      您已经可以看到它的顺序是您想要的。现在来收拾东西。您可以以最简单的形式使用flatMap 来展平数组。

      // lodash
      const fm = _.flatMap(z)
      
      // or with Array.prototype.flat()
      const fm = z.flat()
      

      这将为您提供一个数组。

      [
        1,         3,         12,
        undefined, 9,         2,
        8,         13,        undefined,
        10,        4,         7,
        undefined, undefined, undefined,
        6,         undefined, undefined,
        undefined, undefined
      ]
      

      现在您只需要通过过滤(保留)所有不是undefined 的元素来删除所有undefined 元素。

      // lodash
      _.filter(fm, _.negate(_.isUndefined))
      

      你有你的最终结果。

      [1, 3, 12, 9, 2, 8, 13, 10, 4, 7, 6]
      

      有很多方法可以解决这个问题,因此您需要根据您的具体情况做出决定,并在简单性、代码易读性、效率等方面取得平衡。

      【讨论】:

      • 使用_.reject(fm, _.isUndefined) 而不是_.filter(fm, _.negate(_.isUndefined))
      【解决方案3】:

      Array.map()求子数组的最长长度,得到所有子数组的长度,Math.max()。使用Array.from() 创建一个长度最长的数组。对于创建的数组中的每个索引,使用Array.flatMap() 从原始子数组中获取所有项目。如果项目是undefined,则使用Nullish coalescing operator (??) 将其替换为空数组,Array.flatMap() 在展平结果数组时会忽略它。使用Array.flat()Array.from() 的输出展平以获得单个数组。

      const fn = arr =>
        Array.from({ length: Math.max(...arr.map(o => o.length)) }, (_, i) => 
          arr.flatMap(o => o[i] ?? [])
        ).flat();
      
      const arrData = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]];
      
      const result = fn(arrData);
      
      console.log(result);

      【讨论】:

        【解决方案4】:

        请尝试我的以下解决方案,它可能会解决您的问题

        let data = [[], [], [1, 2, 4, 6], [8, 9, 10], [], [12], [14, 15], []], index = 0;
        data = data.filter(o => o.length != 0)
        const result = [];
        for (i = 0; i < data.length; i++) {
            if (data[i].length > index) {
                index = data[i].length
            }
            if (data[i].length > 0) {
                for (j = 0; j < index; j++) {
                    if (data[j][i] != undefined) {
                        result.push(data[j][i]);
                    }
                }
            }
        }
        console.log("Result", result);

        【讨论】:

        • 恭喜您获得第一个答案!请记住,您添加了一些有关您修复的内容或正确原因的详细信息。它可以帮助用户了解正在发生的事情,而不仅仅是为用户提供答案。认为这是您所有答案的绝对规则。
        • 这个答案实际上不适用于其他情况。示例 - 将 [1, 2, 4, 6] 更改为 [1],结果将是 [1, 9, 10]
        【解决方案5】:

        由于它是一个嵌套数组,您可以循环检查每个嵌套数组的第一个元素是否未定义。如果不是,您可以将其推送到结果数组中。我为您的参考编写了函数。请检查

         const arrData = [[1, 2, 4, 6], [3, 8, 7], [12, 13], [], [9, 10]];
            function sorter(arr) {
          var result = [];
          if (arr.length > 0) {
            for (var i = 0; i < arr.length; i++) {
              if (arr[i].length > 0) {
                if (arr[i][0] !== undefined) {
                  result.push(arr[i][0]);
                }
              }
            }
          }
          return result;
        }
        
        console.log(sorter(arrData));
        

        我希望这是你所期望的!如果您需要澄清,请联系我。

        【讨论】:

        • 你试过了吗?这绝对行不通
        【解决方案6】:
        • 您需要跟踪index,它定义了每次迭代中要获取的元素的位置。

        • 使用while 循环,当某个index 处的任何数组中没有剩余元素时,该循环将终止。

        • 使用.map 获取每个数组中索引处的元素列表

        • 使用.filter 删除此列表中的undefined 元素,以防其中一个数组在索引处没有元素

        • 使用.isEmpty检查此列表是否为空,然后终止

        const arrData = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]];
        
        let res = [], index = 0;
        
        while(true) {
          const elementsAtIndex = _.filter(
            _.map(arrData, e => e[index]), 
            e => e!==undefined
          );
          if(_.isEmpty(elementsAtIndex)) break;
          res = [...res, ...elementsAtIndex];
          index++;
        }
        
        console.log(...res);
        &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"&gt;&lt;/script&gt;

        【讨论】:

        • 我不明白带有 _.without 和 _.isEmpty 和 _.map 的部分这个下划线语法是什么?
        • @Alex 我添加了更多说明
        【解决方案7】:

        没有任何运算符的简单操作看起来像......

            const ipArr = [ [1, 2, 4, 6], [8, 9, 10], [], [12], [14, 15], [] ]
            let maxLength = 0
            for (let i = 0; i < ipArr.length; i++) {
                if (ipArr[i].length > maxLength) maxLength = ipArr[i].length
            }
            const opArr = []
            for (let j = 0; j < maxLength; j++) {
                for (let k = 0; k < ipArr.length; k++) {
                    if (ipArr[k][j]) opArr.push(ipArr[k][j])
                }            
            }
            console.log('opArr = ', opArr)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多