【问题标题】:What is the most efficient inverse of lodash _.intersection()lodash _.intersection() 最有效的逆是什么
【发布时间】:2020-07-11 14:19:56
【问题描述】:

使用lodash,我想找到两个不同数组之间的所有元素,基本上与_.intersection[with|by]相反或相反。当然,我查看了_.difference[with|by],但它不是 _.intersection 的逆版本,因为它仅将第一个数组与第二个数组进行比较,而不是将它们相互比较。我能得到的最接近的是非常笨拙的,这促使我在这里问我是否错过了更有效和/或更优雅的选择。我只对基于 lodash 的解决方案感兴趣。

这是我能想出的最接近的方法,以获得两个数组之间不同的唯一值数组。我对具有id 属性的值感兴趣,这些属性不在数组中,也对具有匹配id 属性但不同v 属性的值感兴趣。

const n = [{id: 0, v: 9.7}, {id: 1, v: 1.7}, {id: 3, v: 2.6}, {id: 4, v: 1.89}]
const o = [{id: 1, v: 1.7}, {id: 3, v: 3.6}, {id: 7, v: 0.89}, {id: 4, v: 1.89}]

_.uniqBy(_.concat(
    _.differenceWith(n, o, _.isEqual), _.differenceWith(o, n, _.isEqual)), 'id')

该代码将产生:

[{id: 0, v: 9.7}, {id: 3, v: 2.6}, {id: 7, v: 0.89}]

【问题讨论】:

  • 您是如何决定在这两个{id: 3, v: 3.6}{id: 3, v: 2.6} 之间保留的?
  • @CaptainMhmdrz_A v 属性不同
  • 我的意思是你是如何决定在输出中保留2.6 而不是3.6
  • 啊,我明白了。其实我不在乎,我只对它们不同的事实感兴趣。
  • 是冠状病毒导致缺乏活动还是我的问题很无聊或无关紧要?

标签: javascript lodash


【解决方案1】:

_.xorWith 是我能想到的最接近的,但它不适用于您提供的示例,因为两个对象的 id 为 3。

const n = [{id: 0, v: 9.7}, {id: 1, v: 1.7}, {id: 3, v: 2.6}, {id: 4, v: 1.89}]
const o = [{id: 1, v: 1.7}, {id: 3, v: 3.6}, {id: 7, v: 0.89}, {id: 4, v: 1.89}]
_.xorWith(n, o, _.isEqual)

输出将是:

[
  { id: 0, v: 9.7 },
  { id: 3, v: 2.6 },
  { id: 3, v: 3.6 },
  { id: 7, v: 0.89 }
]

【讨论】:

    【解决方案2】:

    我在寻找同样的东西后发现了这个问题,但我后来意识到,对于我的用例 - 识别不匹配的记录,然后为什么它们不匹配 - 没有用像这样的所有差异的列表。

    该列表无法告诉我可以使用的任何内容,因此我仍需要进行进一步操作以查看问题所在的数组。

    所以对我来说,首先检查是否相等,然后使用 _.difference 两次更有意义,因为这样它的结果会产生有用的信息,例如

    if (!_.isEqual(a, b) {
      const idsFromBThatAreNotInA = _.difference(a, b);
      const idsFromAThatAreNotInB = _.difference(b, a);
    }
    

    我不知道OP的用例是什么,所以我不知道这是否直接相关,但也许它可以帮助其他人。

    【讨论】:

      猜你喜欢
      • 2016-06-19
      • 2018-11-26
      • 1970-01-01
      • 2011-02-19
      • 2013-06-21
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多