691 votes

Comment supprimer des objets d'un tableau associatif en javascript ?

Supposons que j'ai ce code :

var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;

Maintenant, si je voulais supprimer "nom de famille" ? .... y a-t-il un équivalent de
myArray["lastname"].remove() ?

(J'ai besoin que l'élément disparaisse car le nombre d'éléments est important et je veux garder les choses propres).

32 votes

Un conseil : ne confondez pas les tableaux et les cartes. Certains langages, comme le php, ont un seul objet pour les deux. Bien que vous ayez utilisé le bon type ici (new Object()) et que vous l'ayez nommé myArray, c'est juste une question de standards pour un langage.

0 votes

N'oubliez pas que JavaScript est sans type et que tout est un objet. Voir la réponse de Saul ci-dessous.

4 votes

@StephanKristyn - pour être précis, JS a des types mais dans une dynamique y faible façon. Par exemple, si ses variables sont effectivement sans typage, leurs valeurs ne le sont pas. C'est le dynamique partie. Faible indique que opérations entre différents types de valeurs ne sont pas strictement définis et reposent sur des conversions en coulisse ; par exemple "Test" + {}; est une déclaration JS parfaitement valide.

1240voto

Dennis Cheung Points 11818

Utilisez le mot clé "delete" en Javascript.

delete myArray["lastname"];

20 votes

Cela posera des problèmes si on l'utilise sur une instance d'objet Array pour supprimer un élément existant, par ex. delete myArray[0] . Voir stackoverflow.com/a/9973592/426379 y Suppression d'éléments de tableau

4 votes

Quels problèmes seront causés ?

28 votes

@Gottox - Le length d'un objet Array reste inchangée.

89voto

Jason Bunting Points 27534

Tous les objets en JavaScript sont implémentés sous forme de tableaux associatifs ou de hashtables. Ainsi, les éléments suivants sont équivalents :

alert(myObj["SomeProperty"]);
alert(myObj.SomeProperty);

Et, comme déjà indiqué, vous "supprimez" une propriété d'un objet via la fonction delete que vous pouvez utiliser de deux manières :

delete myObj["SomeProperty"];
delete myObj.SomeProperty;

J'espère que ces informations supplémentaires vous aideront...

12 votes

Il convient de noter que la notation par points ne fonctionne pas si la propriété n'est pas un terme simple, c'est à dire myObj['some;property'] fonctionne, mais myObj.some;property ne le ferait pas (pour des raisons évidentes). De plus, il n'est peut-être pas évident que vous pouvez utiliser une variable dans la notation entre parenthèses, c'est-à-dire var x = 'SomeProperty'; alert(myObj[x])

2 votes

"Tous les objets en JavaScript sont implémentés comme des hashtables/réseaux associatifs. " - faux. V8 préfère stocker un objet comme une classe cachée + des champs densément emballés. Ce n'est que si vous leur faites des choses bizarres (comme supprimer des champs) qu'il abandonne et utilise une carte de hachage dans les coulisses.

5 votes

@JanDvorak - Hé, vous reconnaissez quand cette réponse a été écrite à l'origine, n'est-ce pas ? Cette description était et est toujours suffisante pour la plupart des besoins. Cela dit, je comprends qu'on puisse être péniblement pédant :)

43voto

Saul Points 10449

Problème

Aucune des réponses précédentes n'aborde le fait que Javascript n'a pas de tableaux associatifs pour commencer - il n'y a pas de array en tant que tel, voir typeof .

Ce que Javascript a, ce sont des instances d'objets avec des propriétés dynamiques. Lorsque les propriétés sont confondues avec les éléments d'une instance d'objet Array, alors de mauvaises choses™ sont vouées à se produire :

var elements = new Array()

elements.push(document.getElementsByTagName("head")[0])
elements.push(document.getElementsByTagName("title")[0])
elements["prop"] = document.getElementsByTagName("body")[0]

console.log("number of elements: ", elements.length)   // returns 2
delete elements[1]
console.log("number of elements: ", elements.length)   // returns 2 (?!)

for (var i = 0; i < elements.length; i++)
{
   // uh-oh... throws a TypeError when i == 1
   elements[i].onmouseover = function () { window.alert("Over It.")}
   console.log("success at index: ", i)
}

Solution

Pour avoir une fonction de suppression universelle qui ne vous explose pas à la figure, utilisez :

Object.prototype.removeItem = function (key) {
   if (!this.hasOwnProperty(key))
      return
   if (isNaN(parseInt(key)) || !(this instanceof Array))
      delete this[key]
   else
      this.splice(key, 1)
};

//
// Code sample.
//
var elements = new Array()

elements.push(document.getElementsByTagName("head")[0])
elements.push(document.getElementsByTagName("title")[0])
elements["prop"] = document.getElementsByTagName("body")[0]

console.log(elements.length)                        // returns 2
elements.removeItem("prop")
elements.removeItem(0)
console.log(elements.hasOwnProperty("prop"))        // returns false as it should
console.log(elements.length)                        // returns 1 as it should

9 votes

Cette solution a deux problèmes : elle cache le fait que les tableaux et les objets sont deux choses complètement différentes en JS (vous le savez, mais apparemment pas le PO) et elle utilise des prototypes. Le PO ferait mieux d'apprendre à connaître les tableaux et les objets (et de nommer ses variables en conséquence) - essayer de cacher les différences entre les deux ne fera que lui causer plus de problèmes. IMHO bien sûr.

2 votes

@johndodo - tous Array en JS sont des objets, essayez typeof new Array(); o typeof [] à vérifier. Array est simplement un certain type d'objet et pas du tout une "bête différente". En JS, les objets se distinguent par le nom de leur constructeur et leur chaîne de prototypes, cf. Programmation basée sur des prototypes .

11 votes

Vous ne comprenez pas. Je sais que les tableaux sont aussi des objets, mais cela ne signifie pas qu'il soit sage de les utiliser comme tels. Le programmeur doit décider s'il veut utiliser quelque chose comme un tableau (avec push, pop, [],...) ou comme un objet/"tableau associatif". Le mélange des deux n'est pas une bonne recette, précisément à cause des problèmes que votre solution tente de cacher. Si vous décidez à l'avance du modèle de conception à utiliser (tableau ou objet), vous n'aurez pas de tels problèmes.

38voto

Bipin Points 181

Cela supprime seulement l'objet, mais garde la même longueur de tableau.

Pour l'enlever, vous devez faire quelque chose comme :

array.splice(index, 1);

12 votes

En effet, mais dans ce cas, ce n'est pas un tableau qui est utilisé, mais un simple objet, et il n'a donc pas de méthode de longueur ou de division.

2 votes

@Andreaa Panagiotidis Sauf quand on ne parle pas de tableaux, auquel cas c'est faux à 100%.

21voto

johndodo Points 2975

Bien que la réponse acceptée soit correcte, il manque l'explication de son fonctionnement.

Tout d'abord, votre code doit refléter le fait qu'il s'agit de PAS un tableau :

var myObject = new Object();
myObject["firstname"] = "Bob";
myObject["lastname"] = "Smith";
myObject["age"] = 25;

Notez que tous les objets (y compris Array ) peuvent être utilisés de cette manière. Cependant, ne vous attendez pas à ce que les fonctions de tableau standard de JS (pop, push,...) fonctionnent sur les objets !

Comme indiqué dans la réponse acceptée, vous pouvez alors utiliser delete pour supprimer les entrées des objets :

delete myObject["lastname"]

Vous devez décider de la voie que vous souhaitez emprunter - soit utiliser des objets (tableaux associatifs / dictionnaires), soit utiliser des tableaux (cartes). Ne mélangez jamais les deux.

8 votes

Très bonne réponse. Je conseillerais seulement à tous ceux qui lisent ceci que les tableaux en javascript ne devraient pas être abstraits comme des "cartes", mais plutôt comme des "listes". C'est parce que vous ne devriez pas essayer d'avoir le contrôle sur l'index des éléments lorsque vous utilisez des tableaux. Si vous essayez de le faire... eh bien, ne le faites pas :D

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X