web-dev-qa-db-fra.com

Supprimer vs épissure sur un tableau associatif

Si j'ai un tableau associatif JS qui est de ce que je rassemble est vraiment un objet, et je souhaite supprimer un élément, en utilisant delete myArr[someId] définira l'élément sur undefined, tandis que l'épissure ne fonctionnera pas du tout ... alors quelle est l'alternative pour un tableau associatif si je souhaite supprimer un élément (plutôt que de le définir sur undefined)

45
sarsnake

La terminologie dans js peut être déroutante au début, donc permet de rectifier cela.

Oui, à peu près tout dans js est un objet. Cependant, il existe des différences dans les types de données.

Un tableau peut être utilisé comme comme tableau associatif, mais il est différent d'un littéral objet.

var x = []; //array
var y = {}; //object literal

Un tableau est comme une liste. Les clés d'un tableau peuvent être un index numérique ou une chaîne.

var x = ['a','b']; // x[0] === 'a', x[1] === 'b';
var x = [];
    x['one'] = 'a';
    x['blah'] = 'b'; 

Les littéraux d'objets sont comme des dictionnaires. Ils peuvent être utilisés de manière similaire.

var x = { 0: 'a', 1: 'b' };
var x = { one: 'a', two: 'b' };

Cependant, c'est là que vous devez comprendre les différences.

Vous pouvez utiliser un tableau comme un littéral objet, mais vous ne pouvez pas utiliser un littéral objet tout comme un tableau.

Les tableaux ont la propriété "longueur" automatisée, qui augmente et diminue automatiquement en fonction du nombre total d'éléments dans le tableau. Vous n'obtenez pas cela avec des littéraux d'objet. Les tableaux obtiennent également toutes les autres méthodes spécifiques aux tableaux comme shift, unshift, splice, pop, Push, etc. Les littéraux d'objet n'ont pas ces méthodes.

Parlons de la suppression et de ce qui se passe sur un tableau et sur un objet littéral.

var x = ['a', 'b']; //["a", "b"]
delete x[0]; //[undefined, "b"]

var x = {0:'1', 1:'b'}// { 0:"1", 1:"b"}
delete x[0]; // { 1:"b" }

Si vous effectuez une suppression sur un élément d'un tableau, la longueur du tableau ne change pas. L'index des éléments est conservé et la valeur est définie sur "non défini";

Inversement, effectuer une suppression sur un littéral d'objet supprime la clé/valeur de l'objet.

Enfin, si vous souhaitez supprimer un élément d'un tableau.

var x = ['a', 'b']; 
x.splice(0,1); //modifies x. ['b']

Donc, en résumé, utilisez la suppression sur les littéraux d'objets. Utilisez l'épissure sur les tableaux.

J'espère que cela t'aides.

167
Geuis

Il n'y a pas d'autre option. myArr["someCrazyIndexYouHaventPreviouslyUsed"] renverra undefined; un tableau associatif vous donnera toujours undefined pour les index qui n'existent pas.

Alors supprimez myArr[someId] entraînera myArr à traiter someId comme tous les autres index qui n'existent pas - n'est-ce pas ce que vous voulez?

5
Adam Rackis