2

Estoy tratando de crear una lista de nombres, la cual no debe de tener ningún nombre repetido.

Para ello estoy usando el siguiente JSON:

[
  {
    "nombre": "María",
    "genero": "Mujer",
    "edad": 21
  },
  {
    "nombre": "Ernesto",
    "genero": "Hombre",
    "edad": 45
  },
  {
    "nombre": "María",
    "genero": "Mujer",
    "edad": 21
  },
  {
    "nombre": "Paco",
    "genero": "Hombre",
    "edad": 12
  }
]

Como podéis ver tiene el nombre de María repetido.

¿Cómo podría conseguir que este nombre no se repitiera más de una vez?

He intentado lo siguiente sin mucho éxito, ya que he estado mirando en Internet y todos más o menos hacen lo mismo, pero a mí no me funciona.

Código HTML:

<html>
<head>

  <head>

  <body>
    <div class="nombres">
      <div class="check">
        <input class="opcion-input" type="checkbox" value="Isabel">
        <label class="opcion-label" for="Isabel">Isabel</label>
      </div>
      <div class="check">
        <input class="opcion-input" type="checkbox" value="Juan">
        <label class="opcion-label" for="Juan">Juan</label>
      </div>
    </div>
  </body>

</html>

Código JavaScript:

let html = '';
personas.forEach(function(item) {
        const nombre = item.nombre;

        function onlyUnique(value, index, self) {
            return self.indexOf(value) === index;
        }

        var unique = nombre.filter(onlyUnique);
        console.log(unique);

        html += '<div class="check"><input class="opcion-input" type="checkbox" value="'
        + unique + '"><label class="opcion-label" for="' + unique + '">'
        + unique +'</label></div>';
});

// Actualizamos nombres
$('div.nombres').append(html);
David E. Luna M.
  • 2,687
  • 4
  • 11
  • 28
MyNameIsUnknown
  • 378
  • 1
  • 9

2 Answers2

2

Para eliminar las personas con nombre repetido (si deseas más criterios, puedes añadir más condiciones al if), es iterar por ese array y copiar aquellos que no existan en el array sin duplicados.

// Datos originales
const personas = [
 {
   "nombre": "María",
   "genero": "Mujer",
   "edad": 21
 },
{
   "nombre": "Ernesto",
   "genero": "Hombre",
   "edad": 45
 },
{
   "nombre": "María",
   "genero": "Mujer",
   "edad": 21
 },
{
   "nombre": "Paco",
   "genero": "Hombre",
   "edad": 12
 },
];

const personasNoDuplicadas = [];

// Vamos iterando por las personas
personas.forEach(p => {
  if(personasNoDuplicadas.findIndex(pd => pd.nombre === p.nombre) === -1) {
    // No existe; al detectar que no existe el mismo nombre, "la copiamos"
    personasNoDuplicadas.push(p);
  }
});

// Este array será el que contenga las personas sin duplicados
console.log('Personas no duplicadas: ', personasNoDuplicadas);

Después de eso ya tienes el array personasNoDuplicadas sin duplicidades.

Espero que te pueda servir. En caso de duda, puedes utilizar los comentarios.

Sema
  • 800
  • 6
  • 8
1

Un truco simple y siempre lo hago, es transformo todos los objetos en JSON, luego lo itero y lo busco por medio de un indexOf(), este me retornara la posición, si la posicion que estoy recorriendo es la misma que me devuelve el indexOf() quiere decir que no esta repetido, almaceno el valor que no esta repetido en un array y lo transformo nuevamente a Objeto; esto me evita hacer la validacion por clave/valor que sugiere Sema

// Datos originales
const personas = [
 {
   "nombre": "María",
   "genero": "Mujer",
   "edad": 21
 },
{
   "nombre": "Ernesto",
   "genero": "Hombre",
   "edad": 45
 },
{
   "nombre": "María",
   "genero": "Mujer",
   "edad": 21
 },
{
   "nombre": "Paco",
   "genero": "Hombre",
   "edad": 12
 },
];
json = personas.map(x => JSON.stringify(x)) 
let result = [];
json.forEach(function(item, pos) {
    if (json.indexOf(item) == pos) {
      result.push(JSON.parse(item))
    }
})
console.log(result)

Por cierto JSON != Objeto

JackNavaRow
  • 6,836
  • 5
  • 22
  • 49
  • 1
    Opción totalmente válida, pero las operaciones de `parse` y `stringify` son pesadas ([artículo 1](https://medium.com/@pmzubar/why-json-parse-json-stringify-is-a-bad-practice-to-clone-an-object-in-javascript-b28ac5e36521), [artículo 2](https://medium.com/ft-product-technology/this-one-line-of-javascript-made-ft-com-10-times-slower-5afb02bfd93f)), sólo para tenerlo en cuenta por si ese array de personas puede llegar a crecer e impactar en el rendimiento – Sema Feb 17 '21 at 01:42
  • 1
    @Sema Obviamente afecta en rendimiento , pero para la cantidad de datos, es imperceptible y una opcion generica – JackNavaRow Feb 17 '21 at 17:00