@s24344

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

Есть массив:

const arr = [
    { id: 1, name: 'Alexey', country: 'Moscow' },
    { id: 2, name: 'Mikhail', country: 'Tula' },
    { id: 3, name: 'Vladimir', country: 'Moscow' },
    { id: 4, name: 'Andrey', country: 'Vladivostok' },
    { id: 5, name: 'Andrey', country: 'Moscow' },
    { id: 6, name: 'Peter', country: 'Vladivostok' },
    { id: 7, name: 'Sergey', country: 'Tula' }
]

Необходимо отфильтровать его следующим образом:

const arr = [
    { id: 1, country: 'Moscow' },
    { id: 2, country: 'Tula' },
    { id: 3, country: 'Vladivostok' }
]
  • Вопрос задан
  • 185 просмотров
Решения вопроса 3
zendor
@zendor
Final UPD (не заметил, что у вас id исходных объектов не сохраняются):
const res = [...new Set(arr.map(o => o.country))].map((country, i) => ({id: i + 1, country}));
Ответ написан
Комментировать
Krasnodar_etc
@Krasnodar_etc
fundraiseup
А почему никто не захотел применить reduce? Может я чего не знаю?
const newArray = arr.reduce((result, elem) => {
  const alreadyExist = Boolean(result.find(qwerty => qwerty.country === elem.country));

  if(!alreadyExist) {
    result.push({
      id: result.length + 1,
      country: elem.country
    });
  }
  return result;
}, []);
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
const newArr = arr
  .filter(function(n) {
    return !(this[n.country] = this.hasOwnProperty(n.country));
  }, {})
  .map((n, i) => ({ id: i + 1, country: n.country }));

или

const newArr = Object.values(arr.reduce((acc, { country }) => {
  acc[0][country] = acc[0][country] || { id: ++acc[1], country };
  return acc;
}, [ {}, 0 ])[0]);

или

const newArr = Array.from(arr.reduce((acc, { country: n }) => (
  acc.set(n, acc.get(n) || { id: -~acc.size, country: n })
), new Map).values());
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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