Supposons que j'ai ce code:
var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;
Maintenant, si je voulais supprimer "nom de famille"? .... y at-il un équivalent demyArray["lastname"].remove()
?
(Il faut que l'élément disparaisse parce que le nombre d'éléments est important et que je veux garder les choses propres.)
Utilisez le mot clé "delete" en Javascript.
delete myArray["lastname"];
MODIFIER:
Dans certains moteurs JavaScript, le mot clé delete peut nuire aux performances car il annule l'optimisation de la compilation/JIT.
http://www.html5rocks.com/en/tutorials/speed/v8/http://www.smashingmagazine.com/2012/11/writing-fast-memory-efficient -javascript /
Tous les objets en JavaScript sont implémentés sous forme de tables de hachage/tableaux associatifs. Donc, voici l'équivalent:
alert(myObj["SomeProperty"]);
alert(myObj.SomeProperty);
Et, comme déjà indiqué, vous "supprimez" une propriété d'un objet via le mot clé delete
, que vous pouvez utiliser de deux manières:
delete myObj["SomeProperty"];
delete myObj.SomeProperty;
J'espère que l'info supplémentaire aide ...
Aucune des réponses précédentes n'aborde le fait que Javascript ne possède pas de tableaux associatifs pour commencer - il n'y a pas de type array
en tant que tel, voir typeof
.
Ce que Javascript a, sont des instances d'objet avec des propriétés dynamiques. Lorsque des propriétés sont confondues avec des éléments d'une instance d'objet Array, Bad Things ™ est inévitable:
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)
}
Pour que la fonction de suppression universelle ne vous explose pas, utilisez:
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
Cela supprime seulement supprime l'objet mais conserve toujours la même longueur de tableau.
Pour supprimer vous devez faire quelque chose comme:
array.splice(index, 1);
Bien que la réponse acceptée soit correcte, il manque l'explication de son fonctionnement.
Tout d'abord, votre code doit refléter le fait que c'est NOT un tableau:
var myObject = new Object();
myObject["firstname"] = "Bob";
myObject["lastname"] = "Smith";
myObject["age"] = 25;
Notez que tous les objets (y compris Array
s) peuvent être utilisés de cette façon. Cependant, ne vous attendez pas à ce que les fonctions de tableau JS standard (pop, push, ...) fonctionnent sur des objets!
Comme indiqué dans la réponse acceptée, vous pouvez ensuite utiliser delete
pour supprimer les entrées d'objets:
delete myObject["lastname"]
Vous devez choisir l’itinéraire que vous souhaitez emprunter - utilisez des objets (tableaux associatifs/dictionnaires) ou utilisez des tableaux (cartes). Ne mélangez jamais les deux.
Utilisez la méthode splice
pour supprimer complètement l'élément d'un tableau d'objets:
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");
Vous utilisez Object, vous ne rencontrez pas de tableau associatif pour commencer. Avec un tableau associatif, ajouter et supprimer des éléments se déroule comme suit:
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
}
Comme d'autres réponses l'ont noté, ce que vous utilisez n'est pas un tableau Javascript, mais un objet Javascript, qui fonctionne presque comme un tableau associatif dans d'autres langues, sauf que toutes les clés sont converties en chaînes. Le nouveau Carte stocke les clés sous leur type d'origine.
Si vous avez un tableau et non un objet, vous pouvez utiliser la fonction . Filter du tableau pour renvoyer un nouveau tableau sans l'élément que vous souhaitez supprimer:
var myArray = ['Bob', 'Smith', 25];
myArray = myArray.filter(function(item) {
return item !== 'Smith';
});
Si vous avez un navigateur plus ancien et jQuery, jQuery a une méthode $.grep
qui fonctionne de la même manière:
myArray = $.grep(myArray, function(item) {
return item !== 'Smith';
});
Il existe un moyen élégant dans Airbnb Style Guide de le faire (ES7):
const myObject = {
a: 1,
b: 2,
c: 3
};
const { a, ...noA } = myObject;
console.log(noA); // => { b: 2, c: 3 }
Droits d'auteur: https://codeburst.io/use-es2015-object-rest-operator-to-omit-properties-38a3ecffe9
Si, pour une raison quelconque, la touche Suppr ne fonctionne pas (comme si cela ne fonctionnait pas pour moi)
Vous pouvez le séparer, puis filtrer les valeurs non définies
// to cut out one element via arr.splice(indexToRemove, numberToRemove);
array.splice(key, 1)
array.filter(function(n){return n});
N'essayez pas de les chaîner car l'épissure renvoie les éléments supprimés;
Vous pouvez supprimer une entrée de votre carte en l'attribuant explicitement à "non défini". Comme dans votre cas:
myArray ["lastname"] = undefined;
Nous pouvons aussi l'utiliser comme une fonction. Angular génère une erreur s’il est utilisé comme prototype. Merci @ HarpyWar. Cela m'a aidé à résoudre un problème.
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");
C'est très simple si vous avez nderscore.js dépendance dans votre projet -
_.omit(myArray, "lastname")
En utilisant le mot-clé "delete"
, il supprimera l'élément array de array en javascript.
Par exemple,
Considérez les déclarations suivantes.
var arrayElementToDelete = new Object();
arrayElementToDelete["id"] = "XERTYB00G1";
arrayElementToDelete["first_name"] = "Employee_one";
arrayElementToDelete["status"] = "Active";
delete arrayElementToDelete["status"];
La dernière ligne du code supprimera l'élément du tableau dont la clé est "status" du tableau.
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);
Sans bouclage/itération nous obtenons le même résultat
Pour les "tableaux":
Si vous connaissez l'indice:
array.splice(index, 1);
Si vous connaissez la valeur:
function removeItem(array, value) {
var index = array.indexOf(value);
if (index > -1) {
array.splice(index, 1);
}
return array;
}
La réponse la plus votée pour delete
fonctionne bien pour les objets mais pas pour les tableaux réels. Si j'utilise delete
cela supprime les éléments des boucles mais conserve l'élément en tant que empty
et la longueur du tableau ne changera pas. Cela peut être un problème dans certains scénarios.
Par exemple, si je fais myArray.toString () sur myArray après sa suppression via delete
, il crée une entrée vide, par exemple, ,
function removeItem (array, value) {
var i = 0;
while (i < array.length) {
if(array[i] === value) {
array.splice(i, 1);
} else {
++i;
}
}
return array;
}
usage:
var new = removeItem( ["Apple","banana", "orange"], "Apple");
// ---> ["banana", "orange"]