Tengo un conjunto de datos que devuelve una matriz de objetos y quiero filtrar cualquiera de los objetos que tienen el mismo valor en la clave de nombre. Un pequeño ejemplo de los datos devueltos:

{
    "product_id": 8432,
    "name": "Coca Cola",
    "size: "500ml",    
    "brewer": "Coke"
},
{
    "product_id": 1641,
    "name": "Coca Cola",
    "size: "355ml", 
    "brewer": "Coke"
},
{
    "product_id": 1010,
    "name": "Pepsi",
    "size": "355ml",    
    "brewer": "Pepsi Cola"
},
{
    "product_id": 5199,
    "name": "Sprite",
    "size": "500ml",    
    "brewer": "Coke"
}

Entonces, uno de esos Coca Cola no debe ser devuelto. Luego paso esa matriz a un componente que se asigna para mostrar los datos.

Por mi vida, no puedo descifrar los nombres duplicados. He intentado .filter pero no puedo entender la lógica interna, he intentado con Set pero eso es nuevo para mí.

¿Alguien tiene alguna idea? Aquí está la función de llamada:

getDrinks = () => {
      const data = await fetch(this.state.url);
      let newData= await data.json();
      newData.length = 10; //the returned data is thousands long and I only want 10 displayed.

      this.setState({
        drinks: jsonData,
      });
  }
0
vysearcadia 29 oct. 2019 a las 21:57

3 respuestas

La mejor respuesta

Desea realizar un seguimiento de qué nombres ha visto mientras itera. Entonces algo como esto:

// A set of names that have occurred.
const names = new Set();
// Filter the data to remove duplicate names.
const result = data.filter(({ name ) => {
    // If the name has occurred already, skip it.
    if (names.has(name)) {
        return false;
    }
    // Otherwise, add it the set of names and keep it.
    names.add(name);
    return true;
});
0
kylepixel 29 oct. 2019 a las 19:08

Intente utilizar el método reduce:

const sourceData = [{
  "product_id": 574031,
  "name": "Coca Cola",
  'size': '500ml',
  "brewer": "Coke"
},
{
  "product_id": 574042,
  "name": "Coca Cola",
  "size": "355ml",
  "brewer": "Coke"
},
{
  "product_id": 7888172,
  "name": "Pepsi",
  "size": "355ml",
  "brewer": "Pepsi Cola"
},
{
  "product_id": 4359922,
  "name": "Sprite",
  "size": "500ml",
  "brewer": "Coke"
}];


const uniqueObjects = sourceData.reduce((a, c) => {
  Object.assign(a, {[c.name]: c});
  return a;
}, {});

const unique = Object.values(uniqueObjects);
console.log(unique);
0
StepUp 29 oct. 2019 a las 19:24

¿Qué tal algo como esto?

const data = await fetch(this.state.url);
const jsonData = await data.json();

var filteredData = [];
jsonData.forEach(drink => {
  if(!filteredData.some(x=>x.name == drink.name)){
    filteredData.push(drink);
  }
})
0
stackoverfloweth 29 oct. 2019 a las 19:03