J'ai un tableau de type Person qui contient des données. Exemple:
for (let i = 0; i < people.length; i++) { for (let j = 0; j < names.length; j++) { if (names[j] === people[i].name) { people.splice(i); } } }
J'ai un autre type de tableau de chaîne [] qui contient les données suivantes:
names = ["John", "Zina"]
;
J'essaye de supprimer les noms qui sont sur le deuxième tableau du premier tableau comme ceci:
XXX
Pourquoi ça ne marche pas?
4 Réponses :
La méthode splice
modifie le tableau inplace . Je vous suggère d'utiliser la méthode filter
.
const people = [{name: "John", age: "18"},{name: "Mike", content: "20"},{name: "Brand", content: "18"},{name: "Alice", content: "50"},{name: "Zina", content: "10"}], names=["John", "Zina"]; console.log(people.filter(({name}) => !names.includes(name)));
Cela ne fonctionne pas tant que les noms sont un type de tableau de chaînes
@KathrineHanson, puis utilisez indexOf à la place inclut
Si vous souhaitez conserver la référence d'objet de personnes
, vous pouvez itérer personnes
à partir de la fin, car Array # splice
avec les éléments à supprimer modifie les index des éléments suivants.
.as-console-wrapper { max-height: 100% !important; top: 0; }
var people = [{ name: "Mike", content: "20" }, { label: "Brand", content: "18" }, { label: "Alice", content: "50" }, { label: "Zina", content: "10" }], names = ["John", "Zina"], i = people.length; while (i--) { if (names.includes(people[i].name) || names.includes(people[i].label)) { people.splice(i, 1); } } console.log(people);
la propriété inclut n'existe pas sur la chaîne de type []
Veuillez vous référer au code ci-dessous.
const people = [{name: "John", age: "18"},{name: "Mike", content: "20"},{label: "Brand", content: "18"},{label: "Alice", content: "50"},{label: "Zina", content: "10"}]; const names = ["Mike","Shiv"]; for (let i = 0; i < people.length; i++) { debugger for (let j = 0; j < names.length; j++) { if (names[j] === people[i].name) { people.splice(i,1); } } } console.log(people)
Splice est en train de modifier le tableau d'origine. c'est-à-dire que à chaque itération si la condition retourne true, le tableau de personnes à cet index est remplacé par undefined et obtient donc une erreur.
vous pouvez utiliser la méthode slice pour obtenir les données que vous souhaitez supprimer. p >
for (let i = 0; i < people.length; i++) { for (let j = 0; j < names.length; j++) { if (names[j] === people[i].name) { console.log("matched",names[j],people[i].name, people.slice(i,i+1),); } } }
ou vous pouvez simplement filtrer les données en utilisant la méthode Filter.
Pourquoi ce changement soudain dans les propriétés? Certains ont
nom
tandis que d'autres ontétiquette
..people.filter (({name}) =>! names.includes (name))
Il vous manque le deuxième paramètre de
splice
. Il supprimera tous les éléments à partir dei
. Même si vous le changez enpeople.splice (i, 1)
, cela interrompra la boucle car: Boucle dans un tableau et en supprimant des éléments, sans interrompre la boucle for . Vous devez faire une boucle dans le sens inverse pour que cela fonctionne