Удалить дубликаты при создании массива с несколькими свойствами в TypeScript - PullRequest
0 голосов
/ 25 февраля 2020

Я получаю массив от API, который выглядит следующим образом:

results = [
  {name: 'Ana', country: 'US', language: 'EN'},
  {name: 'Paul', country: 'UK', language: 'EN'},
  {name: 'Luis', country: 'PH', language: 'SP'},
  {name: 'Tom', country: 'US', language: 'EN'}
];

Из этого я хотел бы создать массив, который выглядит следующим образом:

countries = [
  {filter: 'country', value: 'PH'},
  {filter: 'country', value: 'UK'},
  {filter: 'country', value: 'US'},
];

К этому В конце я попытался:

countries = Array.from([...new Set(this.results.map(item => ({categoryOfFilter: 'country', value: item.country})))]);

Потому что мне сказали использовать set. Это создает массив, как указано выше, но он содержит дубликаты. Вот так:

countries = [
  {filter: 'country', value: 'US'},
  {filter: 'country', value: 'UK'},
  {filter: 'country', value: 'PH'},
  {filter: 'country', value: 'US'},
];

Ребята, у вас есть идеи? Правда в том, что я никогда не был хорош с js во-первых, поэтому я не могу растянуть здесь.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2020

Объект Set позволяет хранить уникальные значения любого типа, будь то примитивные значения или ссылки на объекты .

Наборы не работают таким образом с объектами. Все элементы различны, так как имеют разные ссылки на объекты, даже если все их атрибуты имеют одинаковые значения.

Это будет работать так (разбить его на две строки, чтобы сделать его немного читабельным)

results = [
  {name: 'Ana', country: 'US', language: 'EN'},
  {name: 'Paul', country: 'UK', language: 'EN'},
  {name: 'Luis', country: 'PH', language: 'SP'},
  {name: 'Tom', country: 'US', language: 'EN'}
];

// create a set with all country codes. Set works fine with strings
const countryCodes = new Set(results.map(item => item.country));

// spread the set values into a new array and map that to the target objects
const countries = [...countryCodes].map(value => {return {filter: 'country', value}});

console.log(countries);
1 голос
/ 25 февраля 2020

См. Этот код: https://codepen.io/kyletanders/pen/NWqpWVX?editors=0012

примерно так:


    const data = [
      {name: 'Ana', country: 'US', language: 'EN'},
      {name: 'Paul', country: 'UK', language: 'EN'},
      {name: 'Luis', country: 'PH', language: 'SP'},
      {name: 'Tom', country: 'US', language: 'EN'}
    ];

    let unique = [...new Set(data.map(item => item.country))].map(x => {return {filter: 'Country', value: x}});
    console.log(unique);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...