Frage

Angenommen, ich habe diesen Code:

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

Wenn ich nun entfernen „Nachname“ wollte? .... gibt es einige Äquivalent
myArray["lastname"].remove()?

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

War es hilfreich?

Lösung

Mit dem "Löschen" Schlüsselwort in Javascript.

delete myArray["lastname"];

EDIT:

In einigem JavaScript-Engine, das Lösch Schlüsselwort könnte Performance schaden, wie es die Kompilierung / JIT-Optimierung rückgängig gemacht werden.

http://www.html5rocks.com/en/tutorials/speed/v8 / http://www.smashingmagazine.com/2012/11/ Schreib schnell speichereffizienten-javascript /

Andere Tipps

Alle Objekte in JavaScript als Hash-Tabellen / assoziative Arrays implementiert. So sind die folgenden entspricht:

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

Und, wie bereits angedeutet, Sie „entfernen“ eine Eigenschaft von einem Objekt über das delete Schlüsselwort, das Sie auf zwei Arten verwendet werden:

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

Hoffen, dass die zusätzlichen Informationen helfen ...

Keine der bisherigen Antworten adressiert die Tatsache, dass Javascript nicht assoziative Arrays zu beginnen hat - es gibt keinen array Typen als solche finden Sie unter typeof .

Was Javascript, sind Objektinstanzen mit dynamischen Eigenschaften. Wenn Eigenschaften werden mit Elementen einer Array Objektinstanz verwirren dann ™ Bad Things ist verpflichtet, geschehen:

Problem

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)
}

Lösung

Um eine universelle Entfernungsfunktion, die auf Sie nicht sprengen, verwenden:

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

Das entfernt nur löscht das Objekt, sondern hält immer noch die Array-Länge gleich.

So entfernen Sie etwas tun müssen, wie:

array.splice(index, 1);

Während die akzeptierte Antwort richtig ist, es fehlt die Erklärung, warum es funktioniert.

Zu allererst Ihr Code sollte die Tatsache widerspiegelt, dass dies nicht ein Array:

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

, dass alle Objekte (einschließlich Arrays) können auf diese Weise verwendet werden. Allerdings erwarte nicht für Standard-JS-Array-Funktionen (pop, push, ...) auf Objekte arbeiten!

Wie gesagt in akzeptierte Antwort, können Sie dann delete die Einträge von Objekten zu entfernen:

delete myObject["lastname"]

Sie sollten entscheiden, welche Route Sie nehmen wollen - entweder genutzte Objekte (assoziative Arrays / Wörterbücher) oder Verwendung Arrays (Karten). Niemals die zwei von ihnen mischen.

Verwenden Methode splice vollständig entfernen Element aus einem Objekt-Array:

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");

Sie verwenden Object, Sie sind nicht ein assoziatives Array mit zu beginnen. Mit assoziativem Array, das Hinzufügen und Entfernen von Elementen so geht:

    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
    }

Wie andere Antworten festgestellt haben, was Sie verwenden, ist kein Javascript Array, sondern ein Javascript-Objekt, das in anderen Sprachen außer fast wie ein assoziatives Array funktioniert, dass alle Schlüssel in Zeichenketten umgewandelt werden. Der neue Karte speichert Schlüssel als ihre ursprüngliche Art .

Wenn Sie ein Array haben und nicht ein Objekt, können Sie das Array verwenden filtern Funktion, ein neues Array ohne den Artikel zurückgeben Sie entfernen möchten:

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

Wenn Sie einen älteren Browser und jQuery haben, hat jQuery eine $.grep Methode , die ähnlich funktioniert :

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

Es gibt eine elegante Art und Weise in Airbnb Style Guide diesen (ES7) zu tun:

const myObject = {
  a: 1,
  b: 2,
  c: 3
};
const { a, ...noA } = myObject;
console.log(noA); // => { b: 2, c: 3 }

Copyright: https://codeburst.io / use-es2015-Objekt-rest-Operator-to-omit-Eigenschaften-38a3ecffe90

Wenn aus irgendeinem Grund die Löschtaste nicht funktioniert (wie es funktioniert war nicht für me)

Sie können es Spleiß 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 und verketten sie da Spleiß kehrt entfernt Elemente;

Sie können einen Eintrag aus Ihrer Karte entfernen, indem explizit auf ‚undefiniert‘ zuweisen. Wie in Ihrem Fall:

  

arr [ "name"] = nicht definiert;

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

_.omit(myArray, "lastname")

Auch wir können es als eine Funktion verwenden. wenn Angular wirft einige Fehler als Prototyp verwendet. Dank @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");

Durch die Verwendung der "delete" Schlüsselwort, wird es das Array-Element aus dem Array in Javascript löschen.

Beispiel:

Betrachten Anweisungen folgen.

var arrayElementToDelete = new Object();

arrayElementToDelete["id"]           = "XERTYB00G1"; 
arrayElementToDelete["first_name"]   = "Employee_one";
arrayElementToDelete["status"]       = "Active"; 

delete arrayElementToDelete["status"];

Letzte Zeile des Codes wird das Array-Element entfernen, den Schlüssel ist, ist „Status“ aus dem Array.

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

var s = JSON.stringify(myArray);

s.replace(/"lastname[^,}]+,/g,'');
newmyArray = JSON.parse(p);

Ohne Looping / Iterierten bekommen wir das gleiche Ergebnis

"Arrays":

Wenn Sie wissen, den Index:

array.splice(index, 1);

Wenn Sie wissen um den Wert:

function removeItem(array, value) {
    var index = array.indexOf(value);
    if (index > -1) {
        array.splice(index, 1);
    }
    return array;
}

Die meisten upvoted Antwort für delete funktioniert gut bei Objekten, aber nicht für die realen Arrays. Wenn ich delete verwenden entfernt sie Elemente von Schleifen, sondern halten das Element als empty und die Länge der Anordnung wird nicht ändern. Dies kann ein Problem in einigen Szenarien sein.

Zum Beispiel, wenn ich myArray.toString tun () auf myArray nach dem Entfernen über delete schafft es leeren Eintrag heißt ,,

Die einzige Arbeitsmethode für mich:

function removeItem (array, value) {
    var i = 0;
    while (i < array.length) {
        if(array[i] === value) {
            array.splice(i, 1);
        } else {
            ++i;
        }
    }
    return array;
}

Nutzung:

var new = removeItem( ["apple","banana", "orange"],  "apple");
// ---> ["banana", "orange"]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top