使用lodash从两个对象数组中过滤对象。

3

我正在尝试使用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个回答

2

使用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 中减去(最终我们会得到所有在 param1 中没有名称的 param2 对象)。
  3. 将 param2 和 param1 按名称进行交集运算(我们正在添加在 param2 中具有相同名称的 param1 对象)。
这是示例代码。希望能够帮助到您。

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)

演示


0

使用_.forEach_.find的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'}];

_.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);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接