На самом деле вы можете добиться этого немного более кратко, используя Map
.
по дизайну, Map
имеет только одно значение для каждого ключа, поэтому мы можем индексировать по accountNumber, который будет быстрее проверять для повторных появлений.
Кроме того, Map.set()
возвращает всю карту, что удобно при использовании в Array.reduce()
функциях, потому что мы всегда должны возвращать аккумулятор внутри таких.
То же может быть достигнуто с помощью словаря (Object
) - см. второй фрагмент - но словарь не так удобен, как Map при использовании в Array.reduce()
функциях.
Использование карты:
const data = [
{group: {id: 1, name:"name1", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 2, name:"name2", accountNumber: 1235}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 3, name:"name3", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 4, name:"name4", accountNumber: 1236}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 5, name:"name5", accountNumber: 1237}, plan:{}, plan_account:{}, plan_benefits:{}},
]
const exists = (result, obj) => result.get(obj.group.accountNumber);
const result = data.reduce((result, obj) => !exists(result, obj) ? result.set(obj.group.accountNumber, {id: obj.group.id, accountNumber: obj.group.accountNumber}) : result, new Map())
console.log([...result.values()])
Использование словаря:
const data = [
{group: {id: 1, name:"name1", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 2, name:"name2", accountNumber: 1235}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 3, name:"name3", accountNumber: 1234}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 4, name:"name4", accountNumber: 1236}, plan:{}, plan_account:{}, plan_benefits:{}},
{group: {id: 5, name:"name5", accountNumber: 1237}, plan:{}, plan_account:{}, plan_benefits:{}},
]
const exists = (result, obj) => !!result[obj.group.accountNumber];
const result = data.reduce((result, obj) => {
result[obj.group.accountNumber] = !exists(result, obj) ? {id: obj.group.id, accountNumber: obj.group.accountNumber} : result[obj.group.accountNumber];
return result;
}, {});
console.log(Object.values(result))