【问题标题】:distinct objects between two arrays based on a property - lodash基于属性的两个数组之间的不同对象 - lodash
【发布时间】:2017-09-03 06:59:43
【问题描述】:

有没有一种直接的方法可以从两个不同的数组中根据对象的属性将不同的对象放入一个新数组中?

当前循环遍历第一个数组,然后与第二个数组中的每个对象进行比较,以维护一个计数器并在不同时推入新数组。

   var newArray = [];
   _.each(firstArray, function(item) {               //loop items in 1st []
      var count = 0;        
     _.each(secondArray, function(secondItem) {
       if(secondItem.property = item.property) {      
        count++
       }
     }  
  if(count == 0)   newArray.push(item); //push distinct item into new []
  }

示例数据:

var array1 = [{id:1, busNum: "1234"}, {id:2, busNum:"4567"}]
var array2 = [{id:1, busNum: "2344"}, {id:2, busNum:"1234"}]

想淘汰普通总线(总线号相同的)

  var newArray = [{id:2, bus:"4567"}, {id:1, bus:"2344"]

【问题讨论】:

  • 以及输入和输出内容的一些/一个示例
  • 如果你创建一个 plunker 会很棒

标签: javascript angularjs lodash


【解决方案1】:

我相信你想要的是_.xorBy。 Xor(异或)只会给你两个集合中的元素,而不是两者。例如:

_.xorBy(array1, array2, 'bus')

你可以阅读它的文档here

【讨论】:

  • 请注意,这将包含不同的元素,而是列出both中存在的所有元素> 数组。
  • 哎呀,抱歉,这不是你想要的……一秒钟
【解决方案2】:

就集合数学而言,您正在寻找的是外连接。对应的函数是:_.xorBy

示例:

_.xorBy(array1, array2, 'prop')

你也可以使用:_.hashFullOuterJoin,比如:

_.hashFullOuterJoin(array1, 'prop', array2, 'prop')

【讨论】:

    【解决方案3】:

    您可以将_.xorBy 用作symmetric difference

    var array1 = [{id:1, busNum: "1234"}, {id:2, busNum:"4567"}],
        array2 = [{id:1, busNum: "2344"}, {id:2, busNum:"1234"}],
        result = _.xorBy(array1, array2, 'busNum');
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多