【问题标题】:Find the newly added elements of an Array of Objects with Lodash使用 Lodash 查找对象数组中新添加的元素
【发布时间】:2021-06-10 15:28:32
【问题描述】:

假设我们有两个数组。

var a = [B, C, E];
var b = [A, B, C, D, E];

Array a 是我们在本地保存的默认 Array。 现在我们从中获取的 api 向我们发送了这个名为 b 的数组 a 的新版本。 我怎样才能使用 lodash 所以我可以得到这两个数组的差异所以我在这种情况下得到 [A, D] 返回?

更新: 我想出了自己的解决方案,它有点工作,所以只有在接受的答案由于某种原因不起作用时才尝试这个:

  const getObjectDiff = (newArr, oldArr) => {
    if (_.isEqual(newArr, oldArr)) {
      return true;
    } else {
      const checkLength = newArr.length;
      const checkerLength = oldArr.length;
      var indexes = [];
      var falseIndexes = [];
      var allIndexes = [];
      for (let i = 0; i <= checkerLength; i++) {
        for (let j = 0; j <= checkLength - 1; j++) {
          allIndexes.push(i);
          if (_.isEqual(newArr[i], oldArr[j])) {
            indexes.push(i);
          } else {
            falseIndexes.push(i);
          }
        }
      }
      const falseUniqueIndexes = _.uniq(falseIndexes);
      return _.difference(falseUniqueIndexes, indexes);
    }
  };
```

【问题讨论】:

    标签: javascript node.js arrays lodash javascript-objects


    【解决方案1】:

    我们可以使用_.differenceWith_.isEqual 来检查对象之间的深度相等性。

    _.isEqual 将在两个对象之间进行深度比较以查看它们是否相等,因此我们可以使用它来比较从 JSON 解码的对象。

    这是一个简单的示例,但是,只要它们相等(由 lodash 确定),这将适用于更复杂的对象

    const apiResponseA = '[{"id":"B"},{"id":"C"},{"id":"E"}]';
    const apiResponseB = '[{"id":"A"},{"id":"B"},{"id":"C"},{"id":"D"},{"id":"E"}]'
    
    const a = JSON.parse(apiResponseA);
    const b = JSON.parse(apiResponseB);
    
    console.log("a:", apiResponseA)
    console.log("b:", apiResponseB)
    
    console.log("Difference:", JSON.stringify(_.differenceWith(b,a, _.isEqual)));
    &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;

    【讨论】:

    • 谢谢我写了自己的函数,但现在你想出了一个更好的解决方案,所以再见我的旧函数 xD
    • 太棒了,我认为 lodash 方法应该很管用!
    【解决方案2】:

    我知道您专门要求提供 lodash 解决方案,但我只想提一下,您可以在没有 3rd 方库的情况下非常简单地执行此操作 - 只需使用 Array.prototype.filter 和 Array.prototype.includes,如下所示:

    var a = ['B', 'C', 'E'];
    var b = ['A', 'B', 'C', 'D', 'E'];
    
    function getDifference(a, b) {
      return b.filter(letter => !a.includes(letter));
    }
    
    console.log(getDifference(a, b));

    【讨论】:

    • 我不知道这是否适用于我的对象,但这就是我要求 lodash 的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 2015-06-28
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多