Să presupunem că am acest cod:
var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;
Acum, dacă am vrut pentru a elimina "nume"?....există un echivalent de
myArray["nume"].elimina()
?
(Am nevoie de elementul plecat deoarece numărul de elemente este importantă și vreau să păstrez curat.)
Utilizați "ștergeți" cuvinte cheie în Javascript.
delete myArray["lastname"];
EDIT:
În unele JavaScript motor, șterge cuvinte cheie ar putea răni performanță ca se va anula, compilarea JIT de optimizare.
http://www.html5rocks.com/en/tutorials/speed/v8/ http://www.smashingmagazine.com/2012/11/writing-fast-memory-efficient-javascript/
Toate obiecte în JavaScript sunt puse în aplicare ca hashtables/tablouri asociative. Deci, urmatoarele sunt echivalente:
alert(myObj["SomeProperty"]);
alert(myObj.SomeProperty);
Și, după cum s-a indicat deja, ai "eliminați" o proprietate dintr-un obiect prin intermediul "delete" de cuvinte cheie, pe care le puteți folosi în două moduri:
delete myObj["SomeProperty"];
delete myObj.SomeProperty;
Sper ca info suplimentar ajută...
Nici unul dintre răspunsurile anterioare adresa de faptul că Javascript nu au tablouri asociative pentru a începe cu - nu există nici o "matrice" de tip, ca atare, a se vedea typeof
.
Ce Javascript are, sunt cazuri de obiecte cu proprietăți dinamice. Atunci când proprietățile sunt confundate cu elementele de Matrice obiect exemplu, atunci Lucrurile Rele™ sunt obligate să se întâmple:
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)
}
Pentru a avea un universal îndepărtarea funcție care nu a explodat în față, utilizați:
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
În timp ce a acceptat răspunsul este corect, acesta lipsește explicația de ce funcționează.
În primul rând, codul ar trebui să reflecte faptul că acest lucru este *NU *** o matrice:
var myObject = new Object();
myObject["firstname"] = "Bob";
myObject["lastname"] = "Smith";
myObject["age"] = 25;
Rețineți că toate obiectele (inclusiv Matrice) poate fi folosit în acest fel. Cu toate acestea, nu te astepta pentru standard JS serie de funcții (pop, push,...) pentru a lucra pe obiecte!
Așa cum a spus în răspunsul acceptat, puteți utiliza apoi "delete" pentru a elimina intrările de obiecte:
delete myObject["lastname"]
Tu ar trebui să decidă pe ce drum ai vrea să fie utilizați obiecte (tablouri asociative / dicționare) sau de a folosi tablouri (hărți). Niciodată nu se amestecă două dintre ele.
Metoda de utilizare de îmbinare
pentru a elimina complet elementul de la un obiect 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");
Ca și alte răspunsuri au remarcat, ceea ce îl utilizați nu este o matrice Javascript, dar un obiect Javascript, care funcționează aproape ca un tablou asociativ în alte limbi, cu excepția faptului că toate cheile sunt convertite în șiruri. Noul Harta stochează cheile lor de tip original.
Dacă ați avut o serie și nu un obiect, ai putea folosi matrice's [.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter funcția), pentru a reveni o nouă matrice fără elementul care doriți să fie eliminate:
var myArray = ['Bob', 'Smith', 25];
myArray = myArray.filter(function(item) {
return item !== 'Smith';
});
Dacă aveți un browser mai vechi și jQuery, jQuery are o $.grep
metoda, care funcționează în mod similar:
myArray = $.grep(myArray, function(item) {
return item !== 'Smith';
});
Utilizați Obiect, nu va fi un array asociativ pentru a începe cu. Cu un tablou asociativ, adăugarea și eliminarea elementelor merge ca aceasta:
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
}
Există un mod elegant în Airbnb Ghid de Stil pentru a face acest lucru (ES7):
const myObject = {
a: 1,
b: 2,
c: 3
};
const { a, ...noA } = myObject;
console.log(noA); // => { b: 2, c: 3 }
Drepturi de autor: https://codeburst.io/use-es2015-object-rest-operator-to-omit-properties-38a3ecffe90
O putem folosi ca o funcție prea. Unghiulare aruncă o eroare dacă este folosit ca un prototip. Multumesc @HarpyWar. Ea m-a ajutat a rezolva o problemă.
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");
Dacă pentru orice motiv tasta delete nu funcționează (ca nu a fost de lucru pentru mine )
Puteți de îmbinare și apoi se filtrează valori nedefinite
// to cut out one element via arr.splice(indexToRemove, numberToRemove);
array.splice(key, 1)
array.filter(function(n){return n});
Nu încercați și de a le lanț de îmbinare a se întoarce eliminate elemente;
Prin utilizarea "ștergeți"
cuvinte cheie, se va șterge elementul de matrice de matrice în javascript.
De exemplu,
Luați în considerare următoarele afirmații.
var arrayElementToDelete = new Object();
arrayElementToDelete["id"] = "XERTYB00G1";
arrayElementToDelete["first_name"] = "Employee_one";
arrayElementToDelete["status"] = "Active";
delete arrayElementToDelete["status"];
Ultima linie de cod va elimina elementul de matrice care's cheie este "starea" din matrice.
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);
Fără looping/reiterează vom obține același rezultat
Pentru "Tablouri":
Dacă știți index:
array.splice(index, 1);
Dacă știți valoarea:
function removeItem(array, value) {
var index = array.indexOf(value);
if (index > -1) {
array.splice(index, 1);
}
return array;
}
Cele mai upvoted răspuns pentru "șterge" funcționează bine în cazul de obiecte, dar nu pentru tablouri. Dacă am folosi "șterge" se elimină elemente din bucle, dar păstrează ca element " gol " și lungimea de matrice va schimba. Acest lucru poate fi o problemă în unele scenarii.
De exemplu, dacă aș face-myArray.toString() pe myArray după îndepărtarea prin "ștergere" se creează intrare goală și anume ,,
function removeItem (array, value) {
var i = 0;
while (i < array.length) {
if(array[i] === value) {
array.splice(i, 1);
} else {
++i;
}
}
return array;
}
utilizare:
var new = removeItem( ["apple","banana", "orange"], "apple");
// ---> ["banana", "orange"]