¿Cómo elimino objects 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).

Use la palabra key "eliminar" en Javascript.

 delete myArray["lastname"]; 

EDITAR:

En algunos motores JavaScript, la palabra key delete puede perjudicar el performance, ya que deshace la optimization de compilation / JIT.

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

Todos los objects 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 object mediante la palabra key delete , que puede usar de dos maneras:

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

Espero que la información extra ayude …

Problema

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

Lo que Javascript tiene, son instancias de objects con properties dinámicas. Cuando las properties se confunden con elementos de una instancia de object Array, es probable que ocurran cosas malas ™:

 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 function 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 

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

Para eliminarlo, debes hacer algo como:

 array.splice(index, 1); 

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 NO es una matriz:

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

Tenga en count que todos los objects (incluidos los Array s) se pueden usar de esta manera. Sin embargo, no espere que las funciones de matriz JS estándar (pop, push, …) funcionen en objects.

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

 delete myObject["lastname"] 

Debe decidir qué ruta desea tomar: use objects (matrices asociativas / dictionarys) o use matrices (maps). Nunca mezcles los dos.

Use el splice método para eliminar completamente el elemento de una matriz de objects:

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

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 } 

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

Si tenía una matriz y no un object, podría usar la function .filter de la matriz 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 browser más antiguo y jQuery, jQuery tiene un método $.grep que funciona de manera similar:

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

Si por alguna razón la tecla de borrar no funciona (como si no me funcionara)

Puede empalmarlo y luego filtrar los valores indefinidos

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

No intente encadenarlos ya que el empalme devuelve elementos eliminados;

Es muy sencillo si tienes la dependencia de underscore.js en tu proyecto:

 _.omit(myArray, "lastname") 

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

myArray ["lastname"] = undefined;

Podemos usarlo como una function también. Angular arroja algún error si se usa como prototipo. Gracias @HarpyWar. Me ayudó a resolver un problema.

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

Al usar la palabra key "delete" , eliminará el elemento de matriz de la matriz en javascript.

Por ejemplo,

Considera seguir las declaraciones.

 var arrayElementToDelete = new Object(); arrayElementToDelete["id"] = "XERTYB00G1"; arrayElementToDelete["first_name"] = "Employee_one"; arrayElementToDelete["status"] = "Active"; delete arrayElementToDelete["status"]; 

La última línea del código eliminará el elemento de la matriz cuya key es "estado" de la matriz.

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

Sin bucle / iteración obtenemos el mismo resultado