2011-02-02 5 views
1
Array.prototype.remove = function (obj) { 
    for(var i = 0; i < this.length; i++) { 
     if(this[i] === obj) { 
      if (i == this.length) { 
       this[i] = null; 
      } else { 
       for(var j = i; j < this.length-1; j++) { 
        this[j] = this[j+1]; 
       } 
       delete this[j]; // updated from this[j] = null; still not working. 
      } 
     } 
    } 
    return this; 
}; 

appeler avec:Quel est le problème avec ma fonction de suppression?

write("ARRAY TEST = " + [22, 33, 44].remove(33).remove(22)); 

imprime ..Il:

44,, 

Pourquoi deux virgules et comment corriger ma fonction remove pour supprimer les virgules ainsi?

Répondre

3

delete sur un Array ne supprimera pas l'élément, il sera mis à undefined. Et puisque undefined lorsqu'il est imprimé résulte dans une chaîne vide, cela explique les résultats de write(). Pour supprimer l'élément, vous devez utiliser splice() pour supprimer l'élément. Si vous le combinez avec indexOf (vous devrez peut-être définir pour le navigateur plus) vous obtenez une fonction assez courte:

Array.prototype.remove = function (obj) { 
    this.splice(this.indexOf(obj), 1); 
    return this; 
} 

PS: Je ne suis pas partisan de l'expansion des prototypes indigènes ...

+0

+1 pour tout sauf le * "P.S." *; O) – user113716

+0

Ca marche, ça! J'ai juste trouvé étrange que [ce doc] (http://www.w3schools.com/jsref/jsref_slice_array.asp) dise que le second argument slice est "end", pas "length" tel qu'il est réellement. –

+0

@Tom Pour référence future coller à MDN, w3schools est obsolète et a beaucoup de désinformation. –

-1
Array.prototype.remove = function (obj) { 
    for(var i = 0; i < this.length; i++) { 
     if(this[i] === obj) { 
      if (i == this.length) { 
       #this[i] = null; 
       delete this[i]; 
      } else { 
       for(var j = i; j < this.length-1; j++) { 
        this[j] = this[j+1]; 
       } 
       #this[j] = null; 
       delete this[i]; 
      } 
     } 
    } 
    return this; 
}; 

est assez sûr que ce que vous voulez

+1

I pense que vous voulez dire 'supprimer ce [j]', mais cela ne fonctionne pas, les virgules sont toujours là .. –

+0

-1 supprimer ne supprime pas l'élément du tableau (http://stackoverflow.com/questions/206988/ how-do-i-unset-an-element-in-a-array-in-javascript) – Damp

+0

oh, c'est vrai. Je pensais supprimer d'un objet. >< – JohnO

0

Vous ne supprimez pas les éléments du tableau que vous venez de les mettre à null. Si vous avez besoin d'inspiration, regardez cette méthode de suppression. C'est par index et non par élément.

http://ejohn.org/blog/javascript-array-remove/

essayer:

Array.prototype.remove = function (obj) { 
    for(var i = 0; i < this.length; i++) { 
     if(this[i] === obj) { 
      if (i == this.length) { 
       this.splice(i,1); 
      } else { 
       for(var j = i; j < this.length-1; j++) { 
        this[j] = this[j+1]; 
       } 
       this.splice(j,1); 
      } 
     } 
    } 
    return this; 
}; 
1

Réglage de l'élément null laisse un élément du tableau (mais il est un élément nul), ce qui est la raison pour laquelle vous voyez les virgules encore.

1

Comme indiqué précédemment, la suppression ou la définition de l'élément sur null laisse toujours l'élément dans le tableau. Ce que vous voulez utiliser est Array.splice

Voici une implémentation qui devrait fonctionner:

Array.prototype.remove = function (obj) { 
    for(var i = 0; i < this.length; i++) { 
     if(this[i] === obj) 
     { 
      this.splice(i,1); 
      break; 
     }  
    } 
    return this; 
}; 
Questions connexes