【问题标题】:Filtering objects from two array of objects using lodash使用 lodash 从两个对象数组中过滤对象
【发布时间】:2016-10-07 06:23:42
【问题描述】:

我正在尝试根据名称以及使用 lodash 的几个条件从两个对象数组中过滤对象。这是数组

var param1 = [{'name': 'sa', 'value':'sample'},
              {'name': 'sam', 'value':''}];

var param2 = [{'name': 's1', 'value':'ex1'},
           {'name': 's2', 'value':'ex2'},
           {'name': 's3', 'value':'ex3'},
           {'name': 'sa', 'value':'ex4'}];

我想检查 param2 中是否存在 param1[by name] 的对象,如果存在,则返回 param1 对象以及 param2 中剩余的对象。所以最终的结果必须是这样的:

result= [{'name': 's1', 'value':'ex1'},
         {'name': 's2', 'value':'ex2'},
         {'name': 's3', 'value':'ex3'},
         {'name': 'sa', 'value':'sample'}];

我尝试了几个 lodash 函数,例如 _.filter_.map_.difference,但对于如何链接此功能并获得适当的结果一无所知。

【问题讨论】:

    标签: javascript arrays lodash javascript-objects


    【解决方案1】:

    使用 Lodash,您会想到使用它提供的一些数组函数的几种方法:

    function comparator(a, b) {
        return a.name === b.name;
    }
    
    // First way.
    var res = _.intersectionWith(_.unionWith(param1, param2, comparator), param2, comparator);
    
    // Second way.
    var res1 = _.differenceWith(param2, _.intersectionWith(param1, param2, comparator), _.isEqual).concat(_.intersectionWith(param2, param1, comparator));
    

    第一个解决方案比较明显:

    1. 执行两个数组的并集,按名称比较它们(值从同名对象所在的第一个数组中选择)。
    2. 将结果数组与第二个数组相交(也按名称进行比较),这样我们就可以去掉 param1 中不在 param2 上的对象。

    第二种解决方案有点麻烦,但使用不同(在您的帖子中提到):

    1. 按名称将 param1 和 param2 相交以从 param2 获取公共对象。
    2. 通过等式将结果减去 param2(我们将得到 param2 中没有 param1 中名称的所有对象)。
    3. 将 param2 和 param1 之间的交集按名称连接到减法(我们在 param1 中添加在 param2 中具有相同名称的对象)。

    这是fiddle。希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      不要认为你需要 lodash,你可以使用数组 forEach 执行它

      var param1 = [{
        'name': 'sa',
        'value': 'sample'
      }, {
        'name': 'sam',
        'value': ''
      }];
      
      var param2 = [{
        'name': 's1',
        'value': 'ex1'
      }, {
        'name': 's2',
        'value': 'ex2'
      }, {
        'name': 's3',
        'value': 'ex3'
      }, {
        'name': 'sa',
        'value': 'ex4'
      }];
      
      param1.forEach(function(item) {
           param2.forEach(function(item2){
            if(item.name ==item2.name){
             item2.value = item.value
           }
         })
      
      })
      
      console.log(param2)
      

      DEMO

      【讨论】:

        【解决方案3】:

        Lodash 与 _.forEach_.find

        var param1 = [{'name': 'sa', 'value':'sample'}, {'name': 'sam', 'value':''}];
        var param2 = [{'name': 's1', 'value':'ex1'}, {'name': 's2', 'value':'ex2'}, {'name': 's3', 'value':'ex3'}, {'name': 'sa', 'value':'ex4'}];
        
        _.forEach(param1, a => {
            var o = _.find(param2, b => a.name === b.name);
            if (o) {
                o.value = a.value;
            }
        });
        
        console.log(param2);
        <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

        纯 ES6 Javascript

        var param1 = [{'name': 'sa', 'value':'sample'}, {'name': 'sam', 'value':''}];
        var param2 = [{'name': 's1', 'value':'ex1'}, {'name': 's2', 'value':'ex2'}, {'name': 's3', 'value':'ex3'}, {'name': 'sa', 'value':'ex4'}];
        
        param1.forEach(a => {
            var o = param2.find(b => a.name === b.name);
            if (o) {
                o.value = a.value;
            }
        });
        
        console.log(param2);

        【讨论】:

          猜你喜欢
          • 2018-08-22
          • 2019-05-13
          • 1970-01-01
          • 2015-07-10
          • 2019-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多