Если речь идёт только об уникальности свойства
name
, можно создать объект, где это свойство будет ключом, а последний встретившийся объект с этим свойством – значением. Более поздние объекты с повторным свойством
name
перезаписывают собой более ранние. В конце остаётся вытащить все значения из этого объекта:
Object.values(
arr.reduce(
(acc, c) => {
c.forEach(o => acc[o.name] = o);
// получается объект acc:
// "test": {id: 1, name: 'test'},
// "test2": {id: 2, name: 'test2'},
// "test3": {id: 3, name: 'test3'},
// ...
return acc;
},
{}
)
);
Update. в комментариях выснили, что требуется уникальность не одного, а набора свойств. Тогда принцип тот же, но в качестве ключа использовать некий хэш или отпечаток этих свойств.
Самый простой вариант склеить строки значений. Но возможны коллизии типа
{"name": "Stan", code: "dart"}
и
{"name": "Stand", code: "art"}
— оба дадут отпечаток
"Standart"
и посчитаются идентичными.
Немного лучше удалить из копии объекта св-во
id
, и перевести в JSON. Тут слабое место – порядок свойств. Если у одного из объектов свойства поменяют местами, алгоритм сочтёт их разными.
Object.values(
arr.reduce(
(acc, c) => {
c.forEach(o => {
const source = Object.assign({}, o);
delete source.id;
const hash = JSON.stringify(source);
acc[hash] = o;
});
return acc;
},
{}
)
);