【问题标题】:Looking to find missing information by comparing 2 arrays using LODASH通过使用 LODASH 比较 2 个数组来寻找缺失的信息
【发布时间】:2019-07-31 09:13:43
【问题描述】:

我有 2 个 API 请求返回 2 个数组(每个 API 请求的结果为 1 个数组),它们有 1 个共同值,即时间戳。

我希望使用 LODASH 比较这两个数组并找出其中缺少哪些数组项(获取 2 个不同数组的差异)。

例如,这里有两组数组

array1 =  [
    [
      1564482000000,
      30.5
    ],
    [
      1564482300000,
      null
    ],
    [
      1564482000020,
      30.5
    ]
]


array2 =  [
    [
      1564482000000,
      30.5
    ],
    [
      1564482300000,
      null
    ],
    [
      1564482000010,
      10.5
    ]
]

在上述情况下,数组 1 具有数组 2 没有的以下值

[ 1564482000020, 30.5 ]

同样,数组 2 具有数组 1 没有的以下值

[ 1564482000010, 10.5 ]

预期结果 我希望在 2 个不同的数组中得到缺失值的结果,所以

diff_array2 =     [
      1564482000020,
      30.5
    ]

diff_array1=     [
      1564482000010,
      10.5
    ]

我在 Lodash 中尝试了 XORBY,它给出了组合值,因此无法找出数组 1 或数组 2 中缺少哪个项目,因为 XOR 的结果数组是 1 个数组。项目可能存在也可能不存在

代码示例在这里https://repl.it/repls/LateCorruptTypes

【问题讨论】:

    标签: javascript arrays ecmascript-6 lodash


    【解决方案1】:

    您可以使用differenceBy 传递要用于比较的项目的索引作为迭代对象:

    const diff_array2 = _.differenceBy(array1, array2, 0);    
    
    const diff_array1 = _.differenceBy(array2, array1, 0);
    

    【讨论】:

      【解决方案2】:

      在没有 lodash 的情况下解决。

      我认为示例中两个不匹配数组的索引只是一个巧合。所以下面的代码会做的是,从我们的数组中过滤掉我们在另一个数组中找不到数组的所有数组,以便两者的索引 0 和索引 1 相等。如果数组可以包含长度大于 2 的数组,则可以只迭代元素。

      var array1 = [[1564482000000,30.5],[1564482300000,null],[1564482000020,30.5]],
          array2 = [[1564482000000,30.5],[1564482300000,null],[1564482000010,10.5]];
      
      function diff_arr(arr1, arr2) {
        return arr1.filter(a => !arr2.find(v => v[0] == a[0] && v[1] == v[1]))
      }
      
      console.log(diff_arr(array1, array2))
      console.log(diff_arr(array2, array1))

      如果您只需要数组中的值,您可以随时申请.flat()

      使用下面的 sn-p,您还可以比较内部数组具有可变长度的数组:

      var array1 = [[1564482000000,30.5],[1564482300000,null],[1564482000020,30.5]],
          array2 = [[1564482000000,30.5],[1564482300000,null],[1564482000010,10.5]];
      
      function diff_arr(arr1, arr2) {
        return arr1.filter(a => !arr2.find(e => e.every((v,i) => v == a[i])))
      }
      
      console.log(diff_arr(array1, array2))
      console.log(diff_arr(array2, array1))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-27
        • 1970-01-01
        • 1970-01-01
        • 2019-02-15
        • 1970-01-01
        • 2021-08-31
        • 1970-01-01
        相关资源
        最近更新 更多