J'espère que vous pourrez m'aider. J'essaie de trouver un objet dans un tableau en fonction de son contenu, puis une fois que j'ai trouvé cet objet, supprimez-le complètement du tableau (pour que je puisse ensuite mettre à jour le stockage local avec le tableau nouvellement modifié).
let object = JSON.parse(localStorage.items);
// returns the following:
// [{text: 'Taco'}, {text: 'Pizza'}, {text: 'Curry'}]
object.forEach((obj, i) => {
obj.text === 'Taco' ? object.splice(i) : console.log(`${i}: ${obj.text} is not a Taco.`);
});
À ce stade, je m'attendrais à ce que le tableau d'objets ne contienne plus que Pizza et Curry, mais il contient toujours Taco pour une raison quelconque et je suis super confus! La méthode forEach crache deux journaux de console, un pour Pizza et un pour Curry, mais rien n'arrive réellement au Taco.
Quelqu'un peut-il m'aider à comprendre pourquoi cela ne fonctionne pas?
3 Réponses :
Vous pouvez trouver filter plus facile à utiliser à la place:
const notTacos = arr.filter(obj => obj.text !== 'Taco');
@Minato aussi sans aucun doute une dupe
@LawrenceCherone oui, a été demandé tant de fois et répondu de la même manière: P
Andy, merci pour ça. Je m'habitue encore aux méthodes Array et jusqu'à présent, je ne comprenais pas pourquoi vous n'utiliseriez pas une méthode forEach sur toutes ces choses. Maintenant, avec votre code et avec ce qui précède, je pense que cela a du sens. @Minato, Lawrence Toutes mes excuses si cela a été demandé avant / c'est simple. J'avais l'impression que Stack overflow était une communauté de personnes disponibles pour aider les gens (y compris les développeurs JS débutants) à grandir et à apprendre.
Ouais @ThomasHewitt, filtre avec carte et réduction , contrairement à forEach tous renvoient nouveau < / i> objets plutôt que de muter l'actuel. Ils sont super utiles.
Votre problème est object.splice (i) lorsque le deuxième paramètre (index de fin) est omis, il est considéré comme object.length-1 puisque le object.length-1 code> Taco trouvé à l'index 0th afin de supprimer tous les éléments, Array.splice
let object = [{text: 'Taco'}, {text: 'Pizza'}, {text: 'Curry'}]
let final = object.filter(({ text }) => text !== 'Taco')
console.log(final)
Mais comme bonne pratique, vous ne devriez jamais muter (supprimer l'élément complet) le tableau lorsque vous l'itérez, mieux vaut utiliser filter
let a = [{text: 'Taco'}, {text: 'Pizza'}, {text: 'Curry'}]
let b = [{text: 'Taco'}, {text: 'Pizza'}, {text: 'Curry'}]
a.splice(0)
b.splice(0,1)
console.log(a)
console.log(b)
Ne changez pas la collection sur laquelle vous itérez. Il est toujours en cours d'itération et vous modifiez la collection elle-même.
Utilisez la méthode Filter de Natvie js
Const filteredValue = object.filter (obj => obj.text! == 'Taco')
Merci
Cela a du sens. Jusqu'à présent, je ne savais pas pourquoi vous utiliseriez autre chose que forEach mais maintenant je comprends. Merci
Ne changez jamais la collection sur laquelle vous itérez lorsque vous n'êtes pas absolument sûr des conséquences possibles.
Utilisez
Array.prototype.filter ( )