【问题标题】:NodeJS/Javascript Finding Objects with same Property in different ArrayNodeJS / Javascript在不同数组中查找具有相同属性的对象
【发布时间】:2018-11-03 15:41:21
【问题描述】:

我在 NodeJS 中做一些事情,需要比较不同数组中的对象的重复属性。

例子:

Items = [{"id": "10", "name": "milk"},{"id":"7", "name": "banana"},{"id":"47", "name": "cheese"},{"id":"6", "name":"carrot"}]
Fridge = [{"id":"19", "name": "cheese"},{"id": "10", "name": "milk"},{"id":"43","name": "egg"}, {"id":"6", "name":"not a carrot"}]

我想获取数组中具有包含在两个数组中的属性的所有对象。 (糟糕的解释,见示例)

在这个例子中,我想得到

Output = [{"id": "10", "name": "milk"},{"id":"6", "name":"not a carrot"}]

因为只有这 2 个 ID 存在于两个输入数组中。

我该怎么做?

【问题讨论】:

    标签: javascript arrays node.js object


    【解决方案1】:

    您可以将includes 方法与filter 结合使用。

    Items = [{"id": "10", "name": "milk"},{"id":"7", "name": "banana"},{"id":"47", "name": "cheese"},{"id":"6", "name":"carrot"}]
    Fridge = [{"id":"19", "name": "cheese"},{"id": "10", "name": "milk"},{"id":"43","name": "egg"}, {"id":"6", "name":"not a carrot"}]
    
    result = Fridge.filter(item => Items.map(f => f.id).includes(item.id));
    console.log(result);

    【讨论】:

      【解决方案2】:

      您可以使用 lodash.js 轻松实现这一点,如下所示:

      如果您只想检查 id:

          let Items = [{"id": "10", "name": "milk"},{"id":"7", "name": "banana"},{"id":"47", "name": "cheese"},{"id":"6", "name":"carrot"}]
      let Fridge = [{"id":"19", "name": "cheese"},{"id": "10", "name": "milk"},{"id":"43","name": "egg"}, {"id":"6", "name":"not a carrot"}]
      
      let result = _.intersectionBy(Fridge, Items, 'id');
      
      console.log(result);
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

      或者如果你想比较整个对象:

      let Items = [{"id": "10", "name": "milk"},{"id":"7", "name": "banana"},{"id":"47", "name": "cheese"},{"id":"6", "name":"carrot"}]
      let Fridge = [{"id":"19", "name": "cheese"},{"id": "10", "name": "milk"},{"id":"43","name": "egg"}, {"id":"6", "name":"not a carrot"}]
      
      let result = _.intersectionWith(Items, Fridge, _.isEqual);
      
      console.log(result);
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

      `

      【讨论】:

        【解决方案3】:

        另一种方法可以用于查找具有 n 个对象数组作为输入的重复项:

        var Items = [{"id": "10", "name": "milk"},{"id":"7", "name": "banana"},{"id":"47", "name": "cheese"},{"id":"6", "name":"carrot"}];
        var Fridge = [{"id":"19", "name": "cheese"},{"id": "10", "name": "milk"},{"id":"43","name": "egg"}, {"id":"6", "name":"not a carrot"}];
        
        var mergedArrray = Items.concat(Fridge); //merge all
        //array1 = array1.concat(array2, array3, array4, ..., arrayN);    
        
        
        var duplicateIds = [];
        var uniqueIds = [];
        
        //The idea is look for the id in uniqueIds, if exist push into duplicateIds
        //if not push into uniqueIds 
        mergedArrray.map((obj,v)=>{
        (uniqueIds.indexOf(obj.id) == -1)?uniqueIds.push(obj.id):duplicateIds.push(obj.id);
        })
        
        console.log(duplicateIds);
        console.log(uniqueIds);
        

        此解决方案不返回重复的数组,只返回引用。

        【讨论】:

          猜你喜欢
          • 2014-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-04
          • 2013-10-14
          • 2021-07-17
          • 2020-08-15
          相关资源
          最近更新 更多