#javascript #arrays #merge #lodash
#javascript #массивы #объединить #Lodash
Вопрос:
Мне нужно объединить 2 объекта с вложенными массивами
var dest = {
id: "865",
arr: [{
id: "123",
value: "First" }]
};
var src = {
id: "865",
arr: [{
id: "456",
value: "Second" }]
};
для получения
merge = {
id: "865",
arr: [{id: "123",
value: "First"},
{id: "456",
value: "Second"}]
};
Я попытался использовать _.merge(dest, src) (используя Lodash) и пару других методов, но похоже, что 2-й объект перезаписывает первый, потому что он не обрабатывает вложенный массив так, как я хочу.
Каков наилучший способ сделать это?
Спасибо,
Комментарии:
1.
dest.arr = _.merge(dest.arr,src.arr)
Ответ №1:
Вы можете использовать метод Lodash _.mergeWith:
var dest = {
id: "865",
arr: [{
id: "123",
value: "First"
}]
};
var src = {
id: "865",
arr: [{
id: "456",
value: "Second"
}]
};
var merge = _.mergeWith({}, src, dest, function(a, b) {
if (_.isArray(a)) {
return b.concat(a);
}
});
console.log(merge);
Это позволяет вам передать настройщик, чтобы объединить массив «пользовательским» способом.
Вот скрипка. Надеюсь, это поможет.
Комментарии:
1. Спасибо! Это было то, что я искал.
2. @GavinAng Рад это слышать. Пожалуйста, примите ответ, если вы не против, спасибо!
3. как это должно было измениться, если мне нужно объединить на основе поля id на верхнем уровне (т.е. id = 865). Я понимаю, что вышесказанное не работает, если и src, и dest являются массивами объектов, и я пытаюсь объединить их на основе идентификатора.
Ответ №2:
Вы можете использовать Object.assign()
var dest = {
id: "865",
arr: [{
id: "123",
value: "First" }]
};
var src = {
id: "865",
arr: [{
id: "456",
value: "Second" }]
};
var merge = Object.assign({}, dest);
merge.arr.push(Object.assign({}, src.arr[0]));
src.arr[0].id = 789; // should not affect `merge.arr`
console.log(merge);
Ответ №3:
Без каких-либо библиотек.
var dest = {
id: "865",
arr: [{
id: "123",
value: "First"
}]
};
var src = {
id: "865",
arr: [{
id: "456",
value: "Second"
}]
};
// 1
var resultOne = {
id: dest.id,
arr: src.arr.concat(dest.arr)
};
// 2
var resultTwo = Object.assign({}, src, {
arr: src.arr.concat(dest.arr)
});
// 3
var merge = function(obj1, obj2) {
return Object.keys(obj1).reduce(function(result, next) {
if (Array.isArray(obj1[next]) amp;amp; Array.isArray(obj2[next])) {
result[next] = obj1[next].concat(obj2[next]);
} else if (obj1[next] amp;amp; obj2[next]) {
result[next] = obj2[next];
}
return resu<
}, {});
}
console.log(merge(src, dest));