使用lodash过滤来自两个对象数组的对象

时间:2016-10-07 06:23:43

标签: javascript arrays lodash javascript-objects

我试图根据名称过滤来自两个对象数组的对象以及使用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 [名称]存在的对象,如果是,则返回param1对象以及param2中剩余的其余对象。所以最后的结果必须是这样的:

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

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

3 个答案:

答案 0 :(得分:1)

不要以为你需要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

答案 1 :(得分: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. 将结果数组与第二个数组相交(按名称进行比较),这样我们就可以摆脱不在param2上的param1对象。
  3. 第二种解决方案有点麻烦,但使用差异(在帖子中提到):

    1. 按名称将param1和param2相交以从param2获取公共对象。
    2. 通过相等将结果提取到param2(我们最终会得到param2中param1中没有名称的所有对象)。
    3. 通过名称concat到减法param2和param1之间的交集(我们在param1中添加param1中具有相同名称的对象)。
    4. 这是fiddle。希望它有所帮助。

答案 2 :(得分:0)

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>
&#13;
&#13;
&#13;

普通ES6 Javascript

&#13;
&#13;
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);
&#13;
&#13;
&#13;