Supprimer un objet du tableau à l'aide de JavaScript

549

Comment supprimer un objet d'un tableau? Je souhaite supprimer l'objet contenant le nom Kristiande someArray. Par exemple:

someArray = [{name:"Kristian", lines:"2,5,10"},
             {name:"John", lines:"1,19,26,96"}];

Je veux réaliser:

someArray = [{name:"John", lines:"1,19,26,96"}];
Clem
la source
3
Pour info j'ai annulé la modification de cette question donc la syntaxe du tableau est à nouveau erronée, et toutes ces réponses sont dans leur contexte.
Dunhamzzz
2
Et puis la syntaxe du tableau a été "corrigée" (deux fois) à nouveau, de sorte que les réponses ne sont plus dans leur contexte.
Teepeemm
4
Comment l'erreur de syntaxe aide-t-elle à donner un sens à certaines réponses?
Samy Bencherif
1
@SamyBencherif - Certaines des réponses traitent explicitement de l'erreur de syntaxe dans la version originale de la question, donc si vous supprimez cette erreur de syntaxe, ces réponses parlent maintenant de quelque chose qui n'existe pas.
nnnnnn

Réponses:

778

Vous pouvez utiliser plusieurs méthodes pour supprimer des éléments d'un tableau:

//1
someArray.shift(); // first element removed
//2
someArray = someArray.slice(1); // first element removed
//3
someArray.splice(0, 1); // first element removed
//4
someArray.pop(); // last element removed
//5
someArray = someArray.slice(0, a.length - 1); // last element removed
//6
someArray.length = someArray.length - 1; // last element removed

Si vous souhaitez supprimer l'élément à la position x, utilisez:

someArray.splice(x, 1);

Ou

someArray = someArray.slice(0, x).concat(someArray.slice(-x));

Répondre au commentaire de @ chill182 : vous pouvez supprimer un ou plusieurs éléments d'un tableau en utilisant Array.filter, ou Array.splicecombiné avec Array.findIndex(voir MDN ), par exemple

// non destructive filter > noJohn = John removed, but someArray will not change
let someArray = getArray();
let noJohn = someArray.filter( el => el.name !== "John" ); 
log("non destructive filter > noJohn = ", format(noJohn));
log(`**someArray.length ${someArray.length}`);

// destructive filter/reassign John removed > someArray2 =
let someArray2 = getArray();
someArray2 = someArray2.filter( el => el.name !== "John" );
log("", "destructive filter/reassign John removed > someArray2 =", 
  format(someArray2));
log(`**someArray2.length ${someArray2.length}`);

// destructive splice /w findIndex Brian remains > someArray3 =
let someArray3 = getArray();
someArray3.splice(someArray3.findIndex(v => v.name === "Kristian"), 1);
someArray3.splice(someArray3.findIndex(v => v.name === "John"), 1);
log("", "destructive splice /w findIndex Brian remains > someArray3 =", 
  format(someArray3));
log(`**someArray3.length ${someArray3.length}`);

// Note: if you're not sure about the contents of your array, 
// you should check the results of findIndex first
let someArray4 = getArray();
const indx = someArray4.findIndex(v => v.name === "Michael");
someArray4.splice(indx, indx >= 0 ? 1 : 0);
log("", "check findIndex result first > someArray4 (nothing is removed) > ",
  format(someArray4));
log(`**someArray4.length (should still be 3) ${someArray4.length}`);

function format(obj) {
  return JSON.stringify(obj, null, " ");
}

function log(...txt) {
  document.querySelector("pre").textContent += `${txt.join("\n")}\n`
}

function getArray() {
  return [ {name: "Kristian", lines: "2,5,10"},
           {name: "John", lines: "1,19,26,96"},
           {name: "Brian", lines: "3,9,62,36"} ];
}
<pre>
**Results**

</pre>

KooiInc
la source
2
@Klemzy ne voulais-tu pas dire par index? par valeur ...?
Royi Namir
328
La question d'origine demandait comment supprimer l'objet portant le nom = "Kristian" du tableau. Votre réponse suppose que c'est le premier élément du tableau, mais que se passe-t-il si Kristin n'est pas dans le premier élément? Ensuite, votre réponse ne fonctionne pas.
Rochelle C
7
@ chill182: ce n'est pas une réponse spécifique, mais une réponse plus générale. De là, vous devriez pouvoir déduire la méthode pour supprimer des éléments. Si vous souhaitez supprimer l'élément à la position x ... peut être un indice pour supprimer d'autres éléments que les premiers éléments, non?
KooiInc
6
La fonction d'épissage m'a été utile, mais vous n'auriez pas dû réassigner someArray. Cela entraînera un tableau contenant l'élément supprimé, au lieu qu'il contienne le tableau résultant avec l'élément supprimé.
Kenn Cal
1
Vous devez vérifier le findIndexrésultat avant de l'utiliser splice. S'il n'y a aucun élément dans le tableau qui correspond à la condition findIndexsera renvoyé -1et le mettre directement dans spliceentraînera une suppression arbitraire du dernier élément du tableau.
jdnz
131

Je recommande d'utiliser lodash.js ou sugar.js pour des tâches courantes comme celle-ci:

// lodash.js
someArray = _.reject(someArray, function(el) { return el.Name === "Kristian"; });

// sugar.js
someArray.remove(function(el) { return el.Name === "Kristian"; });

dans la plupart des projets, disposer d'un ensemble de méthodes d'assistance fournies par des bibliothèques comme celles-ci est très utile.

psyho
la source
13
Je pense que l'exemple de soulignement est légèrement décalé. Devrait êtresomeArray = _.reject(someArray, function(el) { return el.Name === "Kristian"; });
Andy Ford
7
Si vous ne voulez pas utiliser underscore.js ou sugar.js, vous pouvez le fairesomeArray = someArray.filter(function(e) { return e.Name !== "Kristian"; });
BenR
1
une autre chose que je veux, il y aura des boutons séparés pour chaque objet dans le tableau. si je veux supprimer cet objet particulier dans le bouton du tableau cliqué. comment faire . j'ai utilisé angulaire js ng-repeat pour générer des articles. pouvez-vous m'aider
Thilak Raj
5
Va aller à contre-courant ici; suggérer d'inclure une bibliothèque entière dans le simple but de supprimer des éléments des objets (que js supporte proprement hors de la boîte, comme le montre la réponse acceptée) est une mauvaise forme. Il ajoute un poids et une complexité inutiles à votre code, sauf si vous en avez déjà besoin pour les fonctionnalités plus puissantes fournies par la bibliothèque.
Josh Doebbert
4
Pour une opération simple, je ne recommanderai jamais d'inclure la bibliothèque
Munna Bhakta
130

La solution propre serait d'utiliser Array.filter:

var filtered = someArray.filter(function(el) { return el.Name != "Kristian"; }); 

Le problème avec cela est qu'il ne fonctionne pas sur IE <9. Cependant, vous pouvez inclure du code provenant d'une bibliothèque Javascript (par exemple underscore.js ) qui l'implémente pour n'importe quel navigateur.

Jon
la source
10
Cela supprimera cependant toutes les occurrences trouvées, pas seulement la première
Flavien Volken
4
Et il renverra un nouveau tableau au lieu de modifier l'original. Selon le cas d'utilisation, cela peut ou non être ce que vous voulez.
Jochie Nabuurs
1
@JochieNabuurs c'est en effet un nouveau tableau. Cependant, l'objet reste le même. Vous pouvez toujours modifier la valeur de chaque objet et il se reflétera sur l'objet du tableau d'origine.
DriLLFreAK100
2
Au point de renvoyer un nouveau tableau, il suffit de changer la solution pour y someArray = someArray.filter(function(el) { return el.Name != "Kristian"; }); remédier, non?
hBrent
93

Que dis-tu de ça?

$.each(someArray, function(i){
    if(someArray[i].name === 'Kristian') {
        someArray.splice(i,1);
        return false;
    }
});
Allan Taylor
la source
8
Cela ne provoquera pas d'erreur, car il $.each()met en cache la longueur du tableau avant de boucler, donc si vous supprimez un élément, $.each()il dépassera la fin du tableau (désormais plus court). (Alors, ce someArray[i]sera undefinedet undefined.nameva planter.)
nnnnnn
5
Ajoutez ensuite un 'return false' après l'épissure.
Allan Taylor
18
ce n'est pas du javascript. -1
onionpsie du
20
Veuillez noter que cette réponse nécessite jQuery
Clarkey
68

Votre "tableau" comme indiqué est une syntaxe JavaScript non valide. Les crochets {}sont pour les objets avec des paires nom / valeur de propriété, mais les crochets []sont pour les tableaux - comme ceci:

someArray = [{name:"Kristian", lines:"2,5,10"}, {name:"John", lines:"1,19,26,96"}];

Dans ce cas, vous pouvez utiliser la .splice()méthode pour supprimer un élément. Pour supprimer le premier élément (index 0), dites:

someArray.splice(0,1);

// someArray = [{name:"John", lines:"1,19,26,96"}];

Si vous ne connaissez pas l'index mais que vous souhaitez rechercher dans le tableau pour trouver l'élément avec le nom "Kristian" à supprimer, vous pouvez:

for (var i =0; i < someArray.length; i++)
   if (someArray[i].name === "Kristian") {
      someArray.splice(i,1);
      break;
   }

EDIT: Je viens de remarquer que votre question est taguée avec "jQuery", vous pouvez donc essayer la $.grep()méthode :

someArray = $.grep(someArray,
                   function(o,i) { return o.name === "Kristian"; },
                   true);
nnnnnn
la source
Pourquoi ont-ils ajouté la surcharge? Vous auriez sûrement pu mettre! = "Kristian". À quoi sert la surcharge?
markthewizard1234
@ markthewizard1234 - Voulez-vous dire l'argument booléen "inverser" dans $.grep()? Cela n'ajoute pas grand-chose dans cet exemple, où oui, j'aurais pu le mettre !=, mais dans d'autres cas, vous pourriez déjà avoir une fonction définie qui arrive à faire le test opposé à ce que vous voulez grep, alors plutôt que de définir un fonction supplémentaire, vous pouvez simplement utiliser cette surcharge pour inverser les résultats.
nnnnnn
Ah, donc si vous aviez une fonction wrapper contenant le grep, vous pourriez définir le booléen comme paramètre. Je l'ai Merci!
markthewizard1234
@ markthewizard1234 - Vous pourriez, mais ce n'est pas ce que j'avais en tête: imaginez que vous en aviez function isEven(num) { return num%2===0 }. Vous pouvez utiliser $.grep(someArray, isEven)pour obtenir uniquement les nombres pairs du tableau, ou $.grep(someArray, isEven, true)pour faire le contraire et obtenir les valeurs non paires.
nnnnnn
63

ES2015

let someArray = [
               {name:"Kristian", lines:"2,5,10"},
               {name:"John", lines:"1,19,26,96"},
               {name:"Kristian", lines:"2,58,160"},
               {name:"Felix", lines:"1,19,26,96"}
            ];

someArray = someArray.filter(person => person.name != 'John');

Cela supprimera John !

Saeid
la source
4
Homme ... Venant de Java, je suis très confus qu'une telle chose de base à faire nécessite le filtrage d'une liste ... wtf. C'est la réponse la plus précise à la question des PO que j'ai lue jusqu'à présent.
codepleb
Oui, c'est une bonne approche. Bien que cela fonctionne également avant ES2015 (ES6). La fonction de filtre est disponible depuis la version 5.1 (2011) ecma-international.org/ecma-262/5.1/#sec-15.4.4.20
user3777549
40

Vous pouvez utiliser array.filter ().

par exemple

        someArray = [{name:"Kristian", lines:"2,5,10"},
                     {name:"John", lines:"1,19,26,96"}];

        someArray = someArray.filter(function(returnableObjects){
               return returnableObjects.name !== 'Kristian';
        });

        //someArray will now be = [{name:"John", lines:"1,19,26,96"}];

Fonctions fléchées:

someArray = someArray.filter(x => x.name !== 'Kristian')
daCoda
la source
une autre chose que je veux, il y aura des boutons séparés pour chaque objet dans le tableau. si je veux supprimer cet objet particulier dans le bouton du tableau cliqué. comment faire . j'ai utilisé angulaire js ng-repeat pour générer des articles. pouvez-vous m'aider
Thilak Raj
daCoda et si vous avez deux conditions?
Malcolm Salvador
@MalcolmSalvador disons par exemple si vous avez d'autres conditions, vous pouvez écrire ceci comme ci-dessous et continuer avec différents && ou || opérateur selon vos besoins. someArray = someArray.filter (function (returnableObjects) {return returnableObjects.name! == 'Kristian' && cond2Query.age> = 22;});
Biswajit Panday
18

J'ai créé une fonction dynamique qui prend les objets Array, Key et value et retourne le même tableau après avoir supprimé l'objet souhaité:

function removeFunction (myObjects,prop,valu)
        {
             return myObjects.filter(function (val) {
              return val[prop] !== valu;
          });

        }

Exemple complet: DEMO

var obj = {
            "results": [
              {
                  "id": "460",
                  "name": "Widget 1",
                  "loc": "Shed"
              }, {
                  "id": "461",
                  "name": "Widget 2",
                  "loc": "Kitchen"
              }, {
                  "id": "462",
                  "name": "Widget 3",
                  "loc": "bath"
              }
            ]
            };


        function removeFunction (myObjects,prop,valu)
        {
             return myObjects.filter(function (val) {
              return val[prop] !== valu;
          });

        }


console.log(removeFunction(obj.results,"id","460"));
Bishoy Hanna
la source
15

C'est une fonction qui fonctionne pour moi:

function removeFromArray(array, value) {
    var idx = array.indexOf(value);
    if (idx !== -1) {
        array.splice(idx, 1);
    }
    return array;
}
ggmendez
la source
une autre chose que je veux, il y aura des boutons séparés pour chaque objet dans le tableau. si je veux supprimer cet objet particulier dans le bouton du tableau cliqué. comment faire . j'ai utilisé angulaire js ng-repeat pour générer des articles. pouvez-vous m'aider
Thilak Raj
12

Vous pouvez également essayer de faire quelque chose comme ceci:

var myArray = [{'name': 'test'}, {'name':'test2'}];
var myObject = {'name': 'test'};
myArray.splice(myArray.indexOf(myObject),1);
Mikebarson
la source
11
someArray = jQuery.grep(someArray , function (value) {
        return value.name != 'Kristian';
});
Andre Morata
la source
10

Utilisez la fonction d'épissage sur les tableaux. Spécifiez la position de l'élément de départ et la longueur de la sous-séquence que vous souhaitez supprimer.

someArray.splice(pos, 1);
gabitzish
la source
8

Votez pour l' UndercoreJS pour un travail simple avec des tableaux.

La fonction _ .without () permet de supprimer un élément:

 _.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
    => [2, 3, 4]
JuliaCesar
la source
La meilleure solution. Fonctionne avec les tableaux d'objets.
Azee
4

Avec fonction flèche ES 6

let someArray = [
                 {name:"Kristian", lines:"2,5,10"},
                 {name:"John", lines:"1,19,26,96"}
                ];
let arrayToRemove={name:"Kristian", lines:"2,5,10"};
someArray=someArray.filter((e)=>e.name !=arrayToRemove.name && e.lines!= arrayToRemove.lines)
Siddhartha
la source
3

La solution la plus simple serait de créer une carte qui stocke les index de chaque objet par nom, comme ceci:

//adding to array
var newPerson = {name:"Kristian", lines:"2,5,10"}
someMap[ newPerson.name ] = someArray.length;
someArray.push( newPerson );

//deleting from the array
var index = someMap[ 'Kristian' ];
someArray.splice( index, 1 );
Creynders
la source
J'aime cette idée, mais je dois également demander, quelles sont les limites d'utilisation de la mémoire pour une idée comme celle-ci lorsque des index sont ajoutés? J'ai un tableau que j'aimerais indexer sur 2 champs différents dans l'objet, donc j'aurais 2 cartes en plus du tableau source d'origine. Est-ce un petit prix à payer pour la vitesse de recherche ou existe-t-il une solution qui serait plus efficace avec la mémoire?
Brad
3

Bien que ce ne soit probablement pas approprié pour cette situation, j'ai découvert l'autre jour que vous pouvez également utiliser le deletemot clé pour supprimer un élément d'un tableau si vous n'avez pas besoin de modifier la taille du tableau, par exemple.

var myArray = [1,2,3];

delete myArray[1];

console.log(myArray[1]); //undefined

console.log(myArray.length); //3 - doesn't actually shrink the array down
dougajmcdonald
la source
3

Cette réponse

for (var i =0; i < someArray.length; i++)
   if (someArray[i].name === "Kristian") {
      someArray.splice(i,1);
   }

ne fonctionne pas pour plusieurs enregistrements remplissant la condition. Si vous disposez de deux enregistrements consécutifs, seul le premier est supprimé et l'autre ignoré. Vous devez utiliser:

for (var i = someArray.length - 1; i>= 0; i--)
   ...

au lieu .

JarmoP
la source
2

Il semble y avoir une erreur dans la syntaxe de votre tableau, donc en supposant que vous voulez dire un tableau par opposition à un objet, Array.splice est votre ami ici:

someArray = [{name:"Kristian", lines:"2,5,10"}, {name:"John", lines:"1,19,26,96"}];
someArray.splice(1,1)
Simon Scarfe
la source
2

Vous pouvez également utiliser la fonction de carte .

someArray = [{name:"Kristian", lines:"2,5,10"},{name:"John",lines:"1,19,26,96"}];
newArray=[];
someArray.map(function(obj, index){
    if(obj.name !== "Kristian"){
       newArray.push(obj);
    }
});
someArray = newArray;
console.log(someArray);
solanki ...
la source
1
Mais si vous voulez parcourir le tableau, n'est-il pas préférable d'utiliser forEach?
corse32
2

Vous pouvez également utiliser some:

someArray = [{name:"Kristian", lines:"2,5,10"},
             {name:"John", lines:"1,19,26,96"}];

someArray.some(item => { 
    if(item.name === "Kristian") // Case sensitive, will only remove first instance
        someArray.splice(someArray.indexOf(item),1) 
})
Artur Grigio
la source
2

C'est ce que j'utilise.

Array.prototype.delete = function(pos){
    this[pos] = undefined;
    var len = this.length - 1;
    for(var a = pos;a < this.length - 1;a++){
      this[a] = this[a+1];
    }
    this.pop();
  }

C'est aussi simple que de dire

var myArray = [1,2,3,4,5,6,7,8,9];
myArray.delete(3);

Remplacez n'importe quel nombre au lieu de trois. Après la sortie attendue devrait être:

console.log(myArray); //Expected output 1,2,3,5,6,7,8,9
Matthias S
la source
2

Si vous souhaitez supprimer toutes les occurrences d'un objet donné (en fonction d'une condition), utilisez la méthode d'épissage javascript dans un pour la boucle.

Étant donné que la suppression d'un objet affecterait la longueur du tableau, assurez-vous de décrémenter le compteur d'une étape, afin que la vérification de la longueur reste intacte.

var objArr=[{Name:"Alex", Age:62},
  {Name:"Robert", Age:18},
  {Name:"Prince", Age:28},
  {Name:"Cesar", Age:38},
  {Name:"Sam", Age:42},
  {Name:"David", Age:52}
];

for(var i = 0;i < objArr.length; i ++)
{
  if(objArr[i].Age > 20)
  {
    objArr.splice(i, 1);
    i--;  //re-adjust the counter.
  }
}

L'extrait de code ci-dessus supprime tous les objets dont l'âge est supérieur à 20 ans.

Obaid
la source
1

splice (i, 1) où i est l'index incrémentiel du tableau supprimera l'objet. Mais rappelez-vous que l'épissure réinitialisera également la longueur du tableau, alors faites attention à «non défini». En utilisant votre exemple, si vous supprimez «Kristian», lors de la prochaine exécution dans la boucle, je serai 2 mais someArray aura une longueur de 1, donc si vous essayez de supprimer «John», vous obtiendrez une erreur «non définie» . Une solution à ce problème, quoique peu élégante, consiste à disposer d'un compteur séparé pour suivre l'index de l'élément à supprimer.

Maksood
la source
1

Renvoie uniquement les objets du tableau dont la propriété namen'est pas "Kristian"

var noKristianArray = $.grep(someArray, function (el) { return el.name!= "Kristian"; });


Démo:

 var someArray = [
                {name:"Kristian", lines:"2,5,10"},
                {name:"John", lines:"1,19,26,96"},
                {name:"Kristian", lines:"2,58,160"},
                {name:"Felix", lines:"1,19,26,96"}
                ];
			 
var noKristianArray = $.grep(someArray, function (el) { return el.name!= "Kristian"; });

console.log(noKristianArray);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Légendes
la source
0

This Concepts using Kendo Grid

var grid = $("#addNewAllergies").data("kendoGrid");

var selectedItem = SelectedCheckBoxList;

for (var i = 0; i < selectedItem.length; i++) {
    if(selectedItem[i].boolKendoValue==true)
    {
        selectedItem.length= 0;
    }
}
Siva Ragu
la source
0

Je suppose que les réponses sont très ramifiées et nouées.

Vous pouvez utiliser le chemin suivant pour supprimer un objet tableau qui correspond à l'objet donné dans le jargon JavaScript moderne.


coordinates = [
    { lat: 36.779098444109145, lng: 34.57202827508546 },
    { lat: 36.778754712956506, lng: 34.56898128564454 },
    { lat: 36.777414146732426, lng: 34.57179224069215 }
];

coordinate = { lat: 36.779098444109145, lng: 34.57202827508546 };

removeCoordinate(coordinate: object) {
  const found = this.coordinates.find((obj) => obj === obj);
  if (found) {
    this.coordinates.splice(found, 1);
  }
}

this.removeCoordinate(coordinate);
Umut Yerebakmaz
la source
-2

Si vous voulez accéder et supprimer un objet d'un tableau, vous pouvez simplement essayer quelque chose comme ça.

// inside some function

let someArray = [ {"ColumnName" : "a", "PropertySerno" : 100005,"UpdateType" : 1},
                  {"ColumnName" : "b", "PropertySerno" : 100202,"UpdateType" : 1,
        "ShowRemoveButton" : true} ];
        
        for (let item of someArray) {
          delete item.ShowRemoveButton;
        }
        console.log(item.outputMappingData.Data);
        
//output will be like that = [ {"ColumnName" : "a", "PropertySerno" : 100005,"UpdateType" : 1},
//                             {"ColumnName" : "b", "PropertySerno" : 100202,"UpdateType" : 1 }];
        

ismailuztemur
la source