Допустим, у меня есть два массива:
let A = [a,b,c,d]
let B = [c,d,e]
, где каждая буква является объектом, обладающим несколькими свойствами, одним из которых является id
, который уникален в моем домене.Тогда объединенный результат будет иметь вид
[a,b,c,d,e]
, где [c,d]
происходит от B.
Используя элегантный подход, как бы я объединил эти два массива так, как любой элемент в B
перезапишет любой существующий в A
, а все остальные останутся нетронутыми.Так что это союз с B
элементами, имеющими приоритет в случае конфликта.
У меня есть две идеи (с использованием ES6 и lodash):
//remove same elements first, then join arrays
let ids = new Set(B.map(e => e.id));
let newState = _.reject(A, constraint => ids.has(constraint.id));
return newState.concat(B);
//convert both to hashmap, join, then take values
let B_map = _.keyBy(B, 'id');
let A_map = _.keyBy(A, 'id');
return {...A_map, ...B_map}.values();
Есть более короткий / более краткий/ более читаемая версия?Может быть, один без внешних зависимостей?По сути, я ищу что-то вроде
Где равенство между любым элементом определяется свойством id
(или функцией сравнения в v2).