Question Comment puis-je supprimer des objets d'un tableau associatif 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 "lastname"? .... y at-il un équivalent de
myArray["lastname"].remove()?

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


522
2017-12-06 06:44


origine


Réponses:


Utilisez le mot-clé "delete" en Javascript.

delete myArray["lastname"];

MODIFIER:

Dans certains moteurs JavaScript, le mot clé delete peut nuire aux performances car il annule l'optimisation de la compilation / JIT.

http://www.html5rocks.com/fr/tutoriels/speed/v8/ http://www.smashingmagazine.com/2012/11/writing-fast-memory-efficient-javascript/


982
2017-12-06 06:46



Tous les objets de JavaScript sont implémentés en tant que tables de hachage / tableaux associatifs. Donc, ce qui suit sont l'équivalent:

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

Et, comme déjà indiqué, vous "supprimez" une propriété d'un objet via le delete mot-clé, que vous pouvez utiliser de deux façons:

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

Espérons que l'info supplémentaire aide ...


71
2017-12-06 07:28



Aucune des réponses précédentes ne répond au fait que Javascript n'a pas de tableaux associatifs pour commencer - il n'y a pas de array tapez 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, les mauvaises choses sont inévitables:

Problème

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 blesse pas, 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

38
2018-04-02 09:07



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

Pour supprimer, vous devez faire quelque chose comme:

array.splice(index, 1);

23
2017-09-13 03:41



Bien que la réponse acceptée soit correcte, il manque l'explication pour laquelle cela fonctionne.

Tout d'abord, votre code devrait refléter le fait que c'est NE PAS un tableau:

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

Notez que tous les objets (y compris Arrays) peut être utilisé de cette façon. Cependant, ne vous attendez pas à ce que les fonctions standard du tableau JS (pop, push, ...) fonctionnent sur des objets!

Comme dit 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 quelle route vous souhaitez emprunter: utilisez des objets (tableaux associatifs / dictionnaires) ou utilisez des tableaux (cartes). Ne mélange jamais les deux.


13
2018-04-05 08:04



Utiliser la méthode splice pour supprimer complètement l'élément d'un tableau d'objets:

Object.prototype.removeItem = function (key, value) {
    if (value == undefined)
        return;

    for (var i in this) {
        if (this[i][key] == value) {
            this.splice(i, 1);
        }
    }
};

var collection = [
    { id: "5f299a5d-7793-47be-a827-bca227dbef95", title: "one" },
    { id: "87353080-8f49-46b9-9281-162a41ddb8df", title: "two" },
    { id: "a1af832c-9028-4690-9793-d623ecc75a95", title: "three" }
];

collection.removeItem("id", "87353080-8f49-46b9-9281-162a41ddb8df");

7
2017-07-23 05:06



Vous utilisez Object, vous n'avez pas de tableau associatif pour commencer. Avec un tableau associatif, l'ajout et la suppression d'éléments vont comme ceci:

    Array.prototype.contains = function(obj) 
    {
        var i = this.length;
        while (i--) 
        {
            if (this[i] === obj) 
            {
                return true;
            }
        }
        return false;
    }


    Array.prototype.add = function(key, value) 
    {
        if(this.contains(key))
            this[key] = value;
        else
        {
            this.push(key);
            this[key] = value;
        }
    }


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



    // Read a page's GET URL variables and return them as an associative array.
    function getUrlVars()
    {
        var vars = [], hash;
        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');

        for(var i = 0; i < hashes.length; i++)
        {
            hash = hashes[i].split('=');
            vars.push(hash[0]);
            vars[hash[0]] = hash[1];
        }

        return vars;
    }



    function ForwardAndHideVariables() {
        var dictParameters = getUrlVars();

        dictParameters.add("mno", "pqr");
        dictParameters.add("mno", "stfu");

        dictParameters.remove("mno");



        for(var i = 0; i < dictParameters.length; i++)
        {
            var key = dictParameters[i];
            var value = dictParameters[key];
            alert(key + "=" + value);
        }
        // And now forward with HTTP-POST
        aa_post_to_url("Default.aspx", dictParameters);
    }


    function aa_post_to_url(path, params, method) {
        method = method || "post";

        var form = document.createElement("form");

        //move the submit function to another variable
        //so that it doesn't get written over if a parameter name is 'submit'
        form._submit_function_ = form.submit;

        form.setAttribute("method", method);
        form.setAttribute("action", path);

        for(var i = 0; i < params.length; i++)
        {
            var key = params[i];

            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);

            form.appendChild(hiddenField);
        }

        document.body.appendChild(form);
        form._submit_function_(); //call the renamed function
    }

5
2018-06-01 08:57



Comme d'autres réponses l'ont noté, ce que vous utilisez n'est pas un tableau Javascript, mais un objet Javascript, qui fonctionne presque comme un tableau associatif dans d'autres langages sauf que toutes les clés sont converties en chaînes. Le nouveau Carte stocke les clés en tant que leur type d'origine.

Si vous avez un tableau et non un objet, vous pouvez utiliser le tableau .filtre fonction, pour retourner un nouveau tableau sans l'élément que vous voulez supprimer:

var myArray = ['Bob', 'Smith', 25];
myArray = myArray.filter(function(item) {
    return item !== 'Smith';
});

Si vous avez un navigateur plus ancien et jQuery, jQuery a un $.grep méthode cela fonctionne de la même manière:

myArray = $.grep(myArray, function(item) {
    return item !== 'Smith';
});

5
2018-06-21 15:24



Vous pouvez supprimer une entrée de votre carte en l'attribuant explicitement à "indéfini". Comme dans votre cas:

myArray ["lastname"] = non défini;


3
2018-01-04 17:59



Si pour une raison quelconque, la touche de suppression ne fonctionne pas (comme si elle ne fonctionnait pas pour moi )

Vous pouvez l'épisser puis filtrer les valeurs indéfinies

// to cut out one element via arr.splice(indexToRemove, numberToRemove);
array.splice(key, 1)
array.filter(function(n){return n});

N'essayez pas de les enchaîner car épissure renvoie les éléments supprimés;


2
2018-05-20 02:12