【问题标题】:How to group by two array by index in javascript with es6 or lodash?如何使用 es6 或 lodash 在 javascript 中按索引对两个数组进行分组?
【发布时间】:2019-11-20 05:23:30
【问题描述】:

我们有相同的两个数组来按索引分组主题。 两个具有相同长度和不同值的数组,如打击。 如何通过 ES6 reduce 或 lodash 对两个数组及其索引进行分组?

array1 = [1,2,3,4] OR [{a:1},{b:2},{c:3},{d:4}]
array2 = [5,6,7,8] OR [{e:5},{f:6},{g:7},{h:8}]

finalArray = [[1,5],[2,6],[3,7],[4,8]]

我正在尝试不同的方法,例如在 es6 中使用 reduce 或 lodash concat 进行分组,但我找不到解决问题的最佳方法。

【问题讨论】:

  • 您所要求的通常称为zip,因此如果 lodash 有 zip 功能,请使用它。

标签: javascript ecmascript-6 lodash


【解决方案1】:

试试这个:

let array1 = [1, 2, 3, 4];
let array2 = [5, 6, 7, 8];
let res = array1.map((value, index) => {
  return [value, array2[index]]
})
console.log(res);

如果是objects的数组

let array1 = [{a:1},{b:2},{c:3},{d:4}];
let array2 = [{e:5},{f:6},{g:7},{h:8}];

let res = array1.map((value, index) => {
  return [Object.values(value)[0],Object.values(array2[index])[0]]
})
console.log(res)

【讨论】:

    【解决方案2】:

    使用lodashes zip函数

    // _ is lodash
    
    const array1 = [1,2,3,4]
    const array2 = [5,6,7,8]
    
    console.log(_.zip(array1, array2))
    

    结果

    [ [ 1, 5 ], [ 2, 6 ], [ 3, 7 ], [ 4, 8 ] ]
    

    如果您正在处理对象数组。使用 Object.values 获取值并获取第 0 个元素。

    const array3 = [{a:1},{b:2},{c:3},{d:4}];
    const array4 = [{e:5},{f:6},{g:7},{h:8}];
    
    function firstval(ob){
      return Object.values(ob)[0]
    }
    
    console.log(_.zip(array3.map(firstval), array4.map(firstval)))
    

    您也可以编写自己的zip。这是一个限量版。它只处理 2 个元素,不接受或返回生成器等。

    它可以很容易地扩展为采用扩展运算符,因此可以使用任意数量的参数。不过,您似乎不需要那种程度的灵活性。

    function zip(a, b) {
      const num = Math.min(a.length, b.length);
      const result = [];
      for(i = 0; i < num; i++) result.push([a[i], b[i]]);
      return result;
    }
    

    【讨论】:

      【解决方案3】:

      以下代码在这些假设下工作:

      1. 所有输入数组的长度相同
      2. 如果数组元素是对象,它只有一个属性
      function getValue(element) {
        if (typeof element === 'object') {
          return Object.values(element).pop()
        } else {
          return element
        }
      }
      
      function zipArrays(arr1, arr2) {
        return arr1.reduce((acc, elm1, index) => {
          const elm2 = arr2[index]
          const elm = [getValue(elm1), getValue(elm2)]
          acc.push(elm)
          return acc
        }, [])
      }
      
      // usage:
      const array1 = [1,2,3,4] // OR [{a:1},{b:2},{c:3},{d:4}]
      const array2 = [5,6,7,8] // OR [{e:5},{f:6},{g:7},{h:8}]
      const finalArray = zipArrays(array1, array2)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-28
        • 1970-01-01
        • 2019-08-31
        • 2012-03-06
        • 2020-08-07
        • 1970-01-01
        • 2018-01-09
        • 1970-01-01
        相关资源
        最近更新 更多