web-dev-qa-db-fra.com

Supprimer un élément de tableau en fonction de la propriété de l'objet

J'ai un tableau d'objets comme celui-ci:

var myArray = [
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money}
];

Comment puis-je supprimer un spécifique en fonction de sa propriété?

par exemple. Comment pourrais-je supprimer l'objet tableau avec 'money' comme propriété du champ?

177
imperium2335

Une possibilité:

myArray = myArray.filter(function( obj ) {
    return obj.field !== 'money';
});

Veuillez noter que filter crée un nouveau tableau. Toutes les autres variables faisant référence au tableau d'origine n'obtiendraient pas les données filtrées bien que vous mettiez à jour votre variable d'origine myArray avec la nouvelle référence. Utiliser avec précaution. 

256
jAndy

Parcourez le tableau et splice dehors ceux que vous ne voulez pas. Pour une utilisation plus facile, itérez en arrière pour ne pas avoir à prendre en compte la nature réelle du tableau

for (var i = myArray.length - 1; i >= 0; --i) {
    if (myArray[i].field == "money") {
        myArray.splice(i,1);
    }
}
67

Supposons que vous souhaitiez supprimer le deuxième objet par sa propriété de champ. 

Avec ES6, c'est aussi simple que cela.

myArray.splice(myArray.findIndex(item => item.field === "cStatus"), 1)
9
Peracek

Vous pouvez utiliser findIndex de lodash pour obtenir l'index de l'élément spécifique, puis le lier.

myArray.splice(_.findIndex(myArray, function(item) {
    return item.value === 'money';
}), 1);

Mettre à jour

Vous pouvez aussi utiliser ES6's findIndex ()

La méthode findIndex () renvoie l'index du premier élément du tableau qui satisfait à la fonction de test fournie. Sinon, -1 est renvoyé.

myArray.splice(myArray.findIndex(myArray, function(item) {
    return item.value === 'money';
}), 1);
8
Sridhar

Voici une autre option utilisant jQuery grep. Passez true en tant que troisième paramètre pour vous assurer que grep supprime les éléments correspondant à votre fonction.

users = $.grep(users, function(el, idx) {return el.field == "money"}, true)

Si vous utilisez déjà jQuery, aucun shim n'est requis, ce qui pourrait être utile par opposition à l'utilisation de Array.filter.

8
sifriday

Voici le code si vous n'utilisez pas jQuery. Démo

var myArray = [
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: 'money'}
];

alert(myArray.length);

for(var i=0 ; i<myArray.length; i++)
{
    if(myArray[i].value=='money')
        myArray.splice(i);
}

alert(myArray.length);

Vous pouvez également utiliser une bibliothèque de soulignement qui a beaucoup de fonctions.

Underscore est une bibliothèque de ceinture utilitaire pour JavaScript fournissant une grande partie du support de programmation

4
Umair Saleem
var myArray = [
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money}
];
console.log(myArray.length); //3
myArray = $.grep(myArray, function(element, index){return element.field == "money"}, true);
console.log(myArray.length); //2

L'élément est un objet du tableau . Le troisième paramètre true signifie qu'un tableau d'éléments qui échoue dans la logique de votre fonction, false signifie qu'un tableau d'éléments qui échoue dans votre logique de fonction.

2
Sandeep sandy

var myArray = [
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: 'money'}
];
var newArray = _.remove(myArray, function(n) {
  return n.value === 'money';;
});
console.log('Array');
console.log(myArray);
console.log('New Array');
console.log(newArray);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>

1
Parth Raval

la solution de jAndy est probablement la meilleure, mais si vous ne pouvez pas compter sur le filtre, vous pouvez faire quelque chose comme:

var myArray = [
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: "money"}
];

myArray.remove_key = function(key){
    var i = 0, 
        keyval = null;
    for( ; i < this.length; i++){
        if(this[i].field == key){
            keyval = this.splice(i, 1);
            break;
        }
    }
    return keyval;
}
1
Rob M.

En fonction de certains commentaires ci-dessous, le code explique comment supprimer un objet en fonction d'un nom de clé et d'une valeur

 var items = [ 
  { "id": 3.1, "name": "test 3.1"}, 
  { "id": 22, "name": "test 3.1" }, 
  { "id": 23, "name": "changed test 23" } 
  ]

    function removeByKey(array, params){
      array.some(function(item, index) {
        return (array[index][params.key] === params.value) ? !!(array.splice(index, 1)) : false;
      });
      return array;
    }

    var removed = removeByKey(items, {
      key: 'id',
      value: 23
    });

    console.log(removed);
0
JackTheKnife