0
votes

Supprimer l'original et le dupliquer d'un tableau d'objets - JS

J'ai un tableau d'objets.

const arr = [{
    title: "sky",
    artist: "Jon",
    id: 1
  },
  {
    title: "rain",
    artist: "Paul",
    id: 2
  },
  {
    title: "sky",
    artist: "Jon",
    id: 1
  }
];
const uniqueScenarios = Array.from(new Set(arr.map(a => a.id)))
  .map(id => {
    return arr.find(a => a.id === id)
  })

console.log(uniqueScenarios)

const arr1 = [{
    title: "sky",
    artist: "Jon",
    id: 1
  },
  {
    title: "rain",
    artist: "Paul",
    id: 2
  },
  {
    title: "sky",
    artist: "Jon",
    id: 1
  },
  {
    title: "rain",
    artist: "Paul",
    id: 2
  }
];
const uniqueScenarios1 = Array.from(new Set(arr1.map(a => a.id)))
  .map(id => {
    return arr1.find(a => a.id === id)
  })

console.log(uniqueScenarios1)


8 Réponses :



0
votes

Un moyen de le faire, afin d'éviter d'exécuter une boucle exponentielle consiste à enregistrer toutes les valeurs à un nouvel objet et à convertir cet objet à un nouveau tableau.

const combinedObj = arr.reduce((obj, item) => { obj[item.id] = item; return obj; }, {});
const newArray = Object.values(combinedObj)


2 commentaires

Ce n'est pas ce qu'OP demande. Ils veulent supprimer tous les objets d'un ID si un ID apparaît plus d'une fois.


exactement. Vous continuerez à l'ajouter à un objet réducteur par un nom de clé: donc réducteur [1] = {id: 1}, écraser la valeur précédente à chaque fois et finissez avec un objet contenant la liste des valeurs uniques;



0
votes

Vous pouvez le faire dans une ligne comme ceci: xxx pré>

ou vous pouvez le faire comme ceci (mieux en termes de complexité de temps): P>

const arr = [
  { title: "sky", artist: "Jon", id: 1  },
  { title: "rain", artist: "Paul", id: 2  },
  { title: "sky", artist: "Jon", id: 1  },

];

const counts = arr.reduce((counts, curr) => (counts[curr.id] = ++counts[curr.id] || 1, counts), {})
const res = arr.filter(curr => counts[curr.id] === 1)



0 commentaires

0
votes

Vous pouvez exécuter le tableau via Réduire () puis utilisez pour voir si vous devez ajouter si cela n'existe pas, ou supprimez à l'aide de Filtre si cela le fait.

Snippet: P>

p>

const arr = [
  { title: "sky", artist: "Jon", id: 1  },
  { title: "rain", artist: "Paul", id: 2  },
  { title: "sky", artist: "Jon", id: 1  },
  { title: "rain", artist: "Paul", id: 2  },
  { title: "earth", artist: "Frank", id: 3  },
];

const unique = arr.reduce((accumulator, currentValue) => { 
  // add if we don't have
  if (!accumulator.some(x => x.id === currentValue.id)) {
    accumulator.push(currentValue);
  } else {
    // remove if we do
    accumulator = accumulator.filter(x => x.id !== currentValue.id);
  }
  
  return accumulator;
}, []); 

console.info(unique);


0 commentaires

0
votes

Vous pouvez trier les données par ID, puis chaque élément qui a un identifiant code> différent code> comparé à l'élément suivant et que l'élément de prev doit être ajouté à la matrice de résultat.

0: {title: "test", artist: "test", id: 3}


0 commentaires

2
votes

Vous pouvez prendre un objet et filtrer avec la valeur de la table de hachage.

p>

const
    array = [{ title: "sky", artist: "Jon", id: 1 }, { title: "rain", artist: "Paul", id: 2 }, { title: "sky", artist: "Jon", id: 1 }, { title: "rain", artist: "Paul", id: 2 }],
    ids = array.reduce((r, { id }) => (r[id] = !(id in r), r), {}),
    result = array.filter(({ id }) => ids[id]);

console.log(result);


3 commentaires

Merci @nina. Ça a marché. Pouvez-vous m'aider à comprendre cela? Stackblitz.com/edit/react-ts-a9pgna?file=validatefile. TSX Je suis capable d'ajouter des éléments mais incapables de les supprimer sur la liste.


@ A2441918, je n'ai aucune idée. S'il vous plaît poser une nouvelle question.


Stackoverflow.com/Questions/62417142/...



0
votes

Vous pouvez regrouper les éléments par ID code>, puis utiliser _. platmap () code> pour convertir un seul tableau. Dans le _. Platmap () code> Rappel renvoie un tableau vide si le groupe a plus d'un élément:

p>

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>


0 commentaires

0
votes

Si vous connaissez le titre code>, artiste code>, ID code> va être dans le même ordre dans chacun de l'objet, une solution peut être Ceci:

p>

var arrayX=[
  { title: "sky", artist: "Jon", id: 1 },
  { title: "rain", artist: "Paul", id: 2 },
  { title: "sky", artist: "Jon", id: 1 }
];
var newArray = arrayX.map(i=> JSON.stringify(i)); //stringify all the objects so as to compare them
var res = newArray.filter((elem, index)=>{
  if(newArray.indexOf(elem) === newArray.lastIndexOf(elem)){
    return elem //get only those elements whihc do not have dupes
  }
}); 
var finalResult = res.map(i=>JSON.parse(i)); //parse the result to get the array of object
console.log(finalResult)


0 commentaires