1
votes

Pourquoi la méthode d'épissage ne fonctionne pas et supprime l'élément sur le tableau dans TypeScript

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?


3 commentaires

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 de i . Même si vous le changez en people.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


4 Réponses :


1
votes

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)));


2 commentaires

Cela ne fonctionne pas tant que les noms sont un type de tableau de chaînes


@KathrineHanson, puis utilisez indexOf à la place inclut



2
votes

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);


1 commentaires

la propriété inclut n'existe pas sur la chaîne de type []



0
votes

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)


0 commentaires

0
votes

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.


0 commentaires