Recibo una matriz de una API que se ve de la siguiente manera:

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'}
];

A partir de esto, me gustaría crear una matriz que se vea así:

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

Con este fin, lo que intenté es:

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

Porque me dijeron que usara set. Esto crea una matriz como se especificó anteriormente, pero contiene duplicados. Al igual que:

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

Tienen alguna idea? La verdad es que nunca fui bueno con js en primer lugar, así que estoy mucho más allá de estirarme aquí.

0
gris 25 feb. 2020 a las 19:49

2 respuestas

La mejor respuesta

Vea este codepen: https://codepen.io/kyletanders/pen/NWqpWVX?editors= 0012

Algo como esto:


    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);
1
Kyle Anderson 25 feb. 2020 a las 16:56

El objeto Set le permite almacenar valores únicos de cualquier tipo, ya sea valores primitivos o referencias de objeto .

Los conjuntos no funcionan así con los objetos. Los elementos son todos diferentes, ya que tienen referencias de objetos diferentes, incluso si sus atributos tienen valores iguales.

Funcionará así (dividirlo en dos líneas para que sea un poco legible)

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);
3
Andreas_D 25 feb. 2020 a las 18:02