web-dev-qa-db-fra.com

Javascript: Supprimer l'attribut pour tous les objets du tableau

Je veux supprimer le "mauvais" attribut de chaque objet du tableau. Y a-t-il une meilleure façon de le faire que d’utiliser une boucle for et de la supprimer de chaque objet?

var array = [{"bad": "something", "good":"something"},{"bad":"something", "good":"something"},...];

for (var i = 0, len = array.length; i < len; i++) {
    delete array[i].bad;
}

Il semble juste qu'il devrait y avoir un moyen d'utiliser un prototype, ou quelque chose du genre. Je ne sais pas. Des idées?

40
Zack Argyle

Les seuls autres moyens sont cosmétiques et sont en fait des boucles.

Par exemple :

array.forEach(function(v){ delete v.bad });

Notez que si vous voulez être compatible avec IE8, vous aurez besoin de un adaptateur pour forEach . Comme vous le mentionnez prototype, prototype.js a également a une cale .

61
Denys Séguret

Avec ES6, vous pouvez déconstruire chaque objet pour en créer un nouveau sans attributs nommés:

const newArray = array.map(({dropAttr1, dropAttr2, ...keepAttrs}) => keepAttrs)
31
piotr_cz

Je préfère utiliser map pour supprimer la propriété, puis renvoyer le nouvel élément de tableau.

array.map(function(item) { 
    delete item.bad; 
    return item; 
});
13
ex0b1t

Si vous utilisez underscore.js :

var strippedRows = _.map(rows, function (row) {
    return _.omit(row, ['bad', 'anotherbad']);
});
9
Cody

Une solution utilisant des prototypes n'est possible que lorsque vos objets se ressemblent:

function Cons(g) { this.good = g; }
Cons.prototype.bad = "something common";
var array = [new Cons("something 1"), new Cons("something 2"), …];

Mais alors c'est simple (et O(1)):

delete Cons.prototype.bad;
9
Bergi

Je suggérerai d'utiliser Object.assign dans une boucle forEach() pour que les objets soient copiés et n'affectent pas le tableau d'origine d'objets

var res = [];
array.forEach(function(item) { 
    var tempItem = Object.assign({}, item);
    delete tempItem.bad; 
    res.Push(tempItem);
});
console.log(res);
0
Ankit Agarwal