@gsdev99

Как отфильтровать массив, чтобы у элементов значения определённого свойства не повторялись?

Есть массив:

const people = [
    { id: 73334, country: 'Sweden' },
    { id: 73335, country: 'England' },
    { id: 45445, country: '' },
    { id: 98064, country: 'England' },
    { id: 73414, country: 'Sweden' },
    { id: 4544500 },
    { id: 134616, country: 'Sweden' },
    { id: 139503, country: 'Sweden' },
    { id: 88989, country: 'France' },
];

Нужно оставить только те элементы, у которых страны не повторяются, например:

const arr = [
    { id: 73334, country: 'Sweden' },
    { id: 73335, country: 'England' },
    { id: 88989, country: 'France' },
];
  • Вопрос задан
  • 192 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
people.filter((n, i, a) => n.country && i === a.findIndex(m => m.country === n.country))

или

people.filter((n, i, a) => n.country && n === a.find(m => m.country === n.country))

или

people.filter(function({ country: n }) {
  return n && !(this[n] = this.hasOwnProperty(n));
}, {})

или

Object.values(people.reduce((acc, n) => (n.country && (acc[n.country] = n), acc), {}))

или

[...people.reduce((acc, n) => n.country ? acc.set(n.country, n) : acc, new Map).values()]

или

Array.from(
  new Set(people.map(n => n.country).filter(Boolean)),
  n => people.find(m => m.country === n)
)
Ответ написан
RAX7
@RAX7
people.reduce((acc, cur) => {
  if (cur.country && !acc.some(m => m.country === cur.country)) acc.push(cur);
  return acc;
}, []);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
По аналогии с уникальными примитивами в массиве можно сначала сделать массив из стран, а потом так же:
const countries = people.map(el => el.country);
people.filter((el, index) => countries.indexOf(el.country) === index)
/* [
{"id":73334,"country":"Sweden"},
{"id":73335,"country":"England"},
{"id":45445,"country":""},       // про пустые и отсутсвующие страны надо уточнить
{"id":4544500},
{"id":88989,"country":"France"}
]
*/
Ответ написан
Комментировать
@Karpion
Допустим, у нас есть два шведа, id разные - кого оставим?
Без этого - задача не полная.

Я бы смотрел в сторону хаш-массива, у которого страна является индексом. Там пишется совсем просто.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы