703 Stimmen

Wie kann ich Objekte aus einem assoziativen JavaScript-Array entfernen?

Angenommen, ich habe diesen Code:

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

Wenn ich nun "Nachname" entfernen möchte?....gibt es eine Entsprechung von myArray["lastname"].remove() ?

(Ich brauche das Element nicht, weil die Anzahl der Elemente wichtig ist und ich die Dinge sauber halten möchte).

32 Stimmen

Ein Tipp: Verwechseln Sie nicht Arrays und Maps. Einige Sprachen, wie php, haben ein einziges Objekt für beide. Obwohl Sie hier den richtigen Typ verwendet haben (new Object()), haben Sie es myArray genannt, es ist nur eine Frage der Standards einer Sprache.

0 Stimmen

Vergessen Sie nicht, dass JavaScript typfrei ist und alles ein Objekt ist. Siehe die Antwort von Saul unten.

4 Stimmen

@StephanKristyn - um genau zu sein, hat JS Typen, aber in einer dynamisch et schwach Weise. Zum Beispiel sind die Variablen in der Tat typfrei, ihre Werte jedoch nicht. Das ist die dynamisch Teil. Schwach bedeutet, dass Operationen zwischen verschiedenen Werttypen sind nicht genau definiert und beruhen auf Konvertierungen im Hintergrund; zum Beispiel "Test" + {}; ist eine vollkommen gültige JS-Anweisung.

5voto

Leon Punkte 4963

Wenn die Löschtaste aus irgendeinem Grund nicht funktioniert (so wie bei mir), können Sie sie ausspleißen und dann die undefinierten Werte filtern:

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

Versuchen Sie nicht, sie zu verketten, da die Spleißung entfernte Elemente zurückgibt;

5voto

Stefan Steiger Punkte 72861

Sie verwenden Object, und Sie haben kein assoziatives Array. Mit einem assoziativen Array geht das Hinzufügen und Entfernen von Elementen wie folgt:

    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
    }

4voto

Amytis Punkte 91

Sie können einen Eintrag aus Ihrer Karte entfernen, indem Sie ihn explizit als "undefiniert" kennzeichnen. Wie in Ihrem Fall:

myArray["Nachname"] = undefiniert;

1 Stimmen

Dies könnte in Fällen nützlich sein, in denen man nicht sicher ist, ob der Schlüssel im Wörterbuch vorhanden ist, ihn aber für den Fall, dass er vorhanden ist, bereinigen möchte. Korrigieren Sie mich, wenn ich falsch bin Amytis.

3voto

vatsal Punkte 3615

Es ist sehr einfach, wenn Sie eine Underscore.js Abhängigkeit in Ihrem Projekt -

_.omit(myArray, "lastname")

3voto

Omkar Kamale Punkte 31

Wir können sie auch als Funktion verwenden. Angular wirft einige Fehler, wenn als Prototyp verwendet. Danke @HarpyWar. Es hat mir geholfen, ein Problem zu lösen.

var removeItem = function (object, key, value) {
    if (value == undefined)
        return;

    for (var i in object) {
        if (object[i][key] == value) {
            object.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" }
];

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X