【问题标题】:How to use lodash intersectionWith to compare and find same attribute with same value among two arrays with difference structure?如何使用 lodash intersectionWith 在具有不同结构的两个数组中比较并找到具有相同值的相同属性?
【发布时间】:2016-06-02 14:05:54
【问题描述】:

例如,我有两组数组

arr1 = [
  {
    myName: 'Adam',
    mySkill: 'CSS',
  },
  {
    myName: 'Mutalib',
    mySkill: 'JavaScript',
  },
];

arr2 = [
  {
    myName: 'Adam',
    myWeight: '112',
  },
  {
    myName: 'Habib',
    myWeight: '221',
  },
];

我尝试比较它们,并选择与 lodash 的 intersectionWith 函数相同的 myName 的值。但是一直没能做到

newList.push(intersectionWith(arr1.arr2,isEqual])); 

*在这种情况下,intersectionWith(arr1.arr2,isEqual]) 的结果应该是Adam

关于我应该如何进一步进行的任何建议、解决方案和想法?

另外,以前我使用两个 forEach 一个在另一个中来实现这一点...除非这是我可以对这种排序做的最好方法?

【问题讨论】:

    标签: javascript arrays sorting lodash intersection


    【解决方案1】:

    您应该使用intersectionBy() 按属性获取交集。

    var result = _.intersectionBy(arr1, arr2, 'myName');
    

    var arr1 = [{
      myName: 'Adam',
      mySkill: 'CSS',
    }, {
      myName: 'Mutalib',
      mySkill: 'JavaScript',
    }];
    
    var arr2 = [{
      myName: 'Adam',
      myWeight: '112',
    }, {
      myName: 'Habib',
      myWeight: '221',
    }];
    
    var result = _.intersectionBy(arr1, arr2, 'myName');
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.js"></script>

    如果您只想提取与myName 值的交集,则可以使用intersectionBy()map() 懒惰地评估它。

    var result = _(arr1).intersectionBy(arr2, 'myName').map('myName').value();
    

    var arr1 = [{
      myName: 'Adam',
      mySkill: 'CSS',
    }, {
      myName: 'Mutalib',
      mySkill: 'JavaScript',
    }];
    
    var arr2 = [{
      myName: 'Adam',
      myWeight: '112',
    }, {
      myName: 'Habib',
      myWeight: '221',
    }];
    
    var result = _(arr1).intersectionBy(arr2, 'myName').map('myName').value();
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.js"></script>

    【讨论】:

    • 是否可以编辑您的第一个 sn-p 以便生成的数组对象包含第二个数组的属性?在这种情况下 [ { "myName": "Adam", "mySkill": "CSS", myWeight: '112' } ]
    • @MisterFresh 你可能应该问另一个问题,你问的不是上面提供的解决方案的最佳选择。
    【解决方案2】:

    我们可以在不使用 lodash

    的情况下做到这一点
    const intersectionBy = (a, b, fn) => {
      const s = new Set(b.map(fn));
      return a.filter(x => s.has(fn(x)));
    };
    

    例子:

    intersectionBy(arr1, arr2, x => x.myName);
    

    【讨论】:

      【解决方案3】:

      我可以向您推荐这段代码,它可以很好地解决您的问题:

      var jawn = arr1.map(v => v.myName).concat( arr2.map(v => v.myName)).sort().filter(function(item, pos, self) {
         return self.indexOf(item) != pos;
      });
      
      console.log(jawn);
      

      【讨论】:

        【解决方案4】:

        我想为此开发一个通用的可重复使用的解决方案。让我们定义具有至少一个与相似对象具有相同值的公共属性的对象。那么……

        Object.prototype.isSimilar = function(o){ // return true if objects have at least one property with same value in common
          var ok = Object.keys(this);
          return typeof o === "object" ? ok.some(k => this[k] === o[k]) : false;
        };
        Array.prototype.containsSimilar = function(o){ // return true if it includes a similar object
          return this.some(e => typeof o === "object" ? o.isSimilar(e) : o === e);
        };
        Array.prototype.getSimilarObjects = function(...a) { // return similar objects in an array
          return [this,...a].reduce((p,c) => p.filter(e => c.containsSimilar(e)));
        };
        
        var arr1 = [
          {
            myName: 'Adam',
            mySkill: 'CSS',
          },
          {
            myName: 'Mutalib',
            mySkill: 'JavaScript',
          },
        ],
        
            arr2 = [
          {
            myName: 'Adam',
            myWeight: '112',
          },
          {
            myName: 'Habib',
            myWeight: '221',
          },
        ],
         result = arr1.getSimilarObjects(arr2);
        console.log(JSON.stringify(result));

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多