Фильтрация объектов из двух массивов объектов с помощью lodash

#javascript #arrays #lodash #javascript-objects

#javascript #массивы #lodash #javascript-объекты

Вопрос:

Я пытаюсь отфильтровать объекты из двух массивов объектов на основе имени и нескольких условий с использованием 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'}];
  

Я хотел проверить наличие объектов param1 [по имени] в param2, если это так, верните объект param1 вместе с остальными объектами, оставшимися в param2. Таким образом, конечный результат должен быть примерно таким:

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

Я пробовал использовать несколько функций lodash, таких как _.filter , _.map , _.difference но не знаю, как связать эту функциональность и получить соответствующий результат.

Ответ №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).

Вот скрипка. Надеюсь, это поможет.

Ответ №2:

Не думаю, что вам понадобится lodash для этого, вы можете использовать array 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)
  

ДЕМОНСТРАЦИЯ

Ответ №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>  

Простой Javascript ES6

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