#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));
Первое решение немного более очевидно:
- Выполните объединение обоих массивов, сравнивая их по имени (значения выбираются из первого массива, в котором находится объект с тем же именем).
- Пересечение результирующего массива со вторым массивом (сравнение также по имени), чтобы мы могли избавиться от объектов param1, которых нет в param2.
Второе решение немного более громоздкое, но использует разницу (упомянуто в вашем сообщении):
- Пересеките param1 и param2 по имени, чтобы получить общие объекты из param2.
- Вычитаем результат в param2 по равенству (в итоге мы получим все объекты в param2, у которых нет имени в param1).
- Сопоставьте с вычитанием пересечение между 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);