Pregunta ¿Cómo elimino objetos de una matriz asociativa javascript?


Supongamos que tengo este código:

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

Ahora si quisiera eliminar "lastname"? .... ¿hay algún equivalente de
myArray["lastname"].remove()?

(Necesito que el elemento se haya ido porque la cantidad de elementos es importante y quiero mantener las cosas limpias).


522
2017-12-06 06:44


origen


Respuestas:


Use la palabra clave "eliminar" en Javascript.

delete myArray["lastname"];

EDITAR:

En algunos motores JavaScript, la palabra clave delete puede perjudicar el rendimiento, ya que deshace la optimización de compilación / JIT.

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


982
2017-12-06 06:46



Todos los objetos en JavaScript se implementan como matrices hash / asociativas. Entonces, los siguientes son el equivalente:

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

Y, como ya se indicó, "quita" una propiedad de un objeto a través del delete palabra clave, que puede usar de dos maneras:

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

Espero que la información extra ayude ...


71
2017-12-06 07:28



Ninguna de las respuestas anteriores aborda el hecho de que Javascript no tiene matrices asociativas, para empezar, no hay array escriba como tal, vea typeof.

Lo que Javascript tiene, son instancias de objetos con propiedades dinámicas. Cuando las propiedades se confunden con elementos de una instancia de objeto Array, es probable que sucedan Cosas malas:

Problema

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

Solución

Para tener una función de eliminación universal que no explote, use:

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



Eso solo elimina borra el objeto pero mantiene la misma longitud de la matriz.

Para eliminarlo, debes hacer algo como:

array.splice(index, 1);

23
2017-09-13 03:41



Si bien la respuesta aceptada es correcta, le falta la explicación de por qué funciona.

En primer lugar, su código debe reflejar el hecho de que esto es NO una matriz:

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

Tenga en cuenta que todos los objetos (incluidos Arrays) se puede utilizar de esta manera. Sin embargo, no espere que las funciones de matriz JS estándar (pop, push, ...) funcionen en objetos.

Como se dice en la respuesta aceptada, puede usar delete para eliminar las entradas de los objetos:

delete myObject["lastname"]

Debe decidir qué ruta desea tomar: use objetos (matrices asociativas / diccionarios) o use matrices (mapas). Nunca mezcles los dos.


13
2018-04-05 08:04



Método de uso splice para eliminar completamente el elemento de una matriz de objetos:

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



Estás usando Object, no estás teniendo una matriz asociativa para empezar. Con una matriz asociativa, agregar y eliminar elementos es el siguiente:

    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



Como han señalado otras respuestas, lo que está utilizando no es una matriz de Javascript, sino un objeto Javascript, que funciona casi como una matriz asociativa en otros idiomas, excepto que todas las claves se convierten en cadenas. El nuevo Mapa almacena claves como su tipo original.

Si tuviera una matriz y no un objeto, podría usar la matriz .filtrar función, para devolver una nueva matriz sin el elemento que desea eliminar:

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

Si tiene un navegador más antiguo y jQuery, jQuery tiene un $.grep método que funciona de manera similar:

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

5
2018-06-21 15:24



Puede eliminar una entrada de su mapa asignándola explícitamente a 'indefinido'. Como en tu caso:

myArray ["lastname"] = undefined;


3
2018-01-04 17:59