Dans javascript, comment puis-je supprimer un élément d'un ensemble d'objets?

Dans javascript, comment puis-je supprimer un élément d'un ensemble d'objets? Voici le code:

$.fn.mapImage.deletePinpoint = function(image, pinpoint){ var deleted = false; for (var i = 0; i < image.pinpoints.length; i++) { if(image.pinpoints[i].position == pinpoint.position){ image.pinpoints.remove(i); deleted = true; } if(deleted){ image.pinpoints[i].position -= 1; } } $('.edit-mode').find('div.dynamic-pinpoint-area').remove(); $('.edit-mode').find('div.pinpoint-text').remove(); $('.create-mode').find('div.static-pinpoint-area').remove(); $('.create-mode').find('div.pinpoint-text').remove(); $.fn.mapImage.load(image); } 

image.pinpoints est le tableau d'objets. Merci encore les gars!

.splice est la méthode donnée à w3schools.com http://www.w3schools.com/jsref/jsref_splice.asp Pour supprimer un élément d'un tableau avec index x, vous auriez trees.splice(x,x+1); Cela supprime x et le renvoie si vous en avez besoin.

Voir https://developer.mozilla.org/fr/Core_JavaScript_1.5_Reference/Operators/Special_Operators/delete_Operator

P.ex. (de la source)

 var trees = ["redwood","bay","cedar","oak","maple"]; delete trees[3]; if (3 in trees) { // this does not get executed } 

Je pense que vous devriez reformuler la question pour être plus clair. De votre exemple, il semble que plusieurs éléments peuvent être supprimés du tableau image.pinpoints si la propriété de position correspond à celle de point pinpoint . Ainsi, il supprimera chaque image.pinpoints[i].position == pinpoint.positioni passe de 0 à (image.pinpoints.length - 1) .

Étant donné que vous êtes en train d'itérer à travers le tableau en même temps, je ne recommanderais pas d'utiliser l' splice en soi. Au lieu de cela, delete chaque index en premier, puis nettoyez le tableau dans une seconde passe.

splice et la delete fonctionneront différemment, car la suppression crée un trou dans le tableau et définit la valeur de la propriété supprimée comme undefined . D'autre part, l' splice supprime l'élément comme s'il n'existait jamais et réparait les index de tous les éléments après qu'il était contigu. Considérons cet exemple:

 > var a = [2,3,5,7,11]; // create an array of 5 elements > undefined > a[2] // see the value of the third element > 5 > delete a[2] // delete the third element using "delete" > true > a // log contents of a > [2, 3, undefined, 7, 11] > a[2] // index 2 still exists with value "undefined" now > undefined 

splice ici seul est également problématique comme si vous supprimez un élément, tous les index après que cet élément se déplacera, et vous ignorerez la vérification de l'élément suivant. Considérons ce deuxième exemple:

 > var a = [2,3,5,7,11]; // create array of 5 elements > for(var i = 0; i < a.length; i++) { if(a[i] == 3 || a[i] == 5) { // if it's 3 or 5, take it out a.splice(i, 1); } } > a [2, 5, 7, 11]; // yikes, 5 still exists 

Dans l'exemple ci-dessus, 5 est toujours présent car nous n'avons jamais vérifié cette valeur. Lorsque nous avons vu le 3 , l'indice actuel était de 1 . Après avoir épissé le tableau, l'élément suivant – 5 s'est déplacé pour prendre son point et est devenu l'indice 1 . Puisque nous sommes déjà terminés avec l'index 1 à ce stade, nous passerons simplement à l'index suivant – 2 , qui a maintenant la valeur 7 , et sautez 5 . En général, ce n'est pas une bonne pratique d'itérer l'utilisation d'index et de faire des déménagements sur place.

En tant que solution, je créerais un nouveau tableau et n'insérerais que les propriétés qui ne doivent pas être supprimées.

 $.fn.mapImage.deletePinpoint = function(image, pinpoint) { // will hold all objects that are not to be deleted var remainingPinpoints = []; for (var i = 0; i < image.pinpoints.length; i++) { // reverse condition if(image.pinpoints[i].position != pinpoint.position) { // add to new array remainingPinpoints.push(image.pinpoints[i]); } } // assign new array to pinpoints property image.pinpoints = remainingPinpoints; ... }