Supprimer la propriété de tous les objets du tableau

111

Je souhaite supprimer la badpropriété de chaque objet du tableau. Y a-t-il une meilleure façon de le faire que d'utiliser une forboucle 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 prototype, ou quelque chose. Je ne sais pas. Des idées?

Zack Argyle
la source
1
Peu importe, les autres moyens ne peuvent pas obtenir moins que l'O (n) linéaire. Quoi que vous utilisiez, vous devrez accéder à tous les éléments de votre tableau
Brian
Prototype? Comment cela aiderait-il? Ou toutes ces instances d'objets sont-elles du même constructeur et partagent-elles une valeur commune pour bad?
Bergi
1
@Bergi Je me demande s'ils faisaient référence à prototypeJS, ou au Arrayprototype, dont dystroy a illustré
Ian
Je ne suis pas sûr que vous deviez stocker array.length dans une variable avant de boucler. Je suis sûr que vous verrez que cela ne vaut pas la peine si vous profilez.
Denys Séguret
1
@ZackArgyle Oui, dans le cas général, il n'y a rien de plus rapide.
Denys Séguret

Réponses:

120

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

Par exemple :

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

Remarques:

  • si vous voulez être compatible avec IE8, vous aurez besoin d' un shim pour forEach . Comme vous le mentionnez prototype, prototype.js a également une cale .
  • deleteest l'un des pires "tueurs d'optimisation" . Son utilisation casse souvent les performances de vos applications. Vous ne pouvez pas l'éviter si vous souhaitez vraiment supprimer une propriété, mais vous pouvez souvent définir la propriété sur undefinedou simplement créer de nouveaux objets sans la propriété.
Denys Séguret
la source
1
Pas beaucoup mieux que la boucle si la boucle est autorisée à être "fausse" - une doublée aussi: Pfor(var i = 0; i < array.length ) delete array[i].bad
Esailija
1
@Esailija dépend. J'aime utiliser forEachparce que je trouve le code plus expressif (et parce que j'ai arrêté de m'inquiéter pour IE il y a longtemps).
Denys Séguret
1
Aucun d'eux n'exprime «supprimer la mauvaise propriété de tous les objets de ce tableau» d'une manière radicalement différente. forEachest générique et sémantiquement dénué de sens en soi, comme une forboucle.
Esailija
1
@Esailija Je suis d'accord. C'est pourquoi j'ai précisé que c'était "cosmétique". N'est-ce pas clair dans ma réponse?
Denys Séguret
Malheureux. Je m'en tiendrai à la boucle for qui est généralement plus rapide que forEach. Et vraiment ... qui se soucie d'IE8. Merci pour l'aide.
Zack Argyle
173

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

const newArray = array.map(({dropAttr1, dropAttr2, ...keepAttrs}) => keepAttrs)
piotr_cz
la source
16
S'appliquant au problème initial, il peut êtreconst newArray = array.map(({ bad, ...item }) => item);
dhilt
1
Ceci est très recommandé car il ne modifie pas le tableau d'origine (opérations immuables)
Pizzicato
1
Cela devrait être la réponse acceptée car elle renvoie un nouveau tableau au lieu d'écraser l'existant.
user1275105
excellente réponse mais ne fonctionne pas si le nom de la propriété contient un point (.) par exemple 'bad.prop'
Yayati
@Amiraslan J'utiliserais// eslint-disable-next-line no-unused-vars
piotr_cz
20

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; 
});
ex0b1t
la source
12
Sachez que cela mute le tableau d'origine
piotr_cz
1
Dans ce cas particulier, une returndéclaration explicite ne serait pas requise
Sandeep Kumar
4
array.forEach(v => delete v.bad);
Anthony Awuley
14

Si vous utilisez underscore.js :

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

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;
Bergi
la source
3

Pour mon avis, c'est la variante la plus simple

array.map(({good}) => ({good}))
maplemap
la source
3
la question était de supprimer le mauvais, pas de garder le bien. Si vos objets ont 10 champs à conserver et un à supprimer, ce qui précède devient très long à taper.
adrien le
1

Vous pouvez suivre ceci, plus lisible, pas d'augmentation des attentes en raison d'une clé introuvable:

data.map((datum)=>{
                    return {
                        'id':datum.id,
                        'title':datum.login,
                    }
Maifee Ul Asad
la source
0

Je suggérerai d'utiliser Object.assigndans une forEach()boucle afin que les objets soient copiés et n'affecte pas le tableau d'origine des objets

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

Cette question est un peu ancienne maintenant, mais je voudrais proposer une solution alternative qui ne mute pas les données sources et nécessite un effort manuel minimal:

function mapOut(sourceObject, removeKeys = []) {
  const sourceKeys = Object.keys(sourceObject);
  const returnKeys = sourceKeys.filter(k => !removeKeys.includes(k));
  let returnObject = {};
  returnKeys.forEach(k => {
    returnObject[k] = sourceObject[k];
  });
  return returnObject;
}

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

const newArray = array.map(obj => mapOut(obj, [ "bad", ]));

C'est encore un peu moins que parfait, mais conserve un certain niveau d'immuabilité et a la possibilité de nommer plusieurs propriétés que vous souhaitez supprimer. (Suggestions bienvenues)

James Marks
la source
0

J'ai essayé de créer un nouvel objet sans supprimer les coulmns dans Vue.js.

let data =this.selectedContactsDto[];

// selectedContactsDto [] = objet avec la liste des objets de tableau créés dans mon projet

console.log (données); let newDataObj = data.map (({groupsList, customFields, firstname, ... item}) => item); console.log ("newDataObj", newDataObj);

Sunali Bandara
la source
0

Pour supprimer un tableau d'objet de formulaire de paire clé valeur, utilise Postgres SQL comme base de données comme cet exemple:

Il s'agit d'un objet de détails utilisateur de retour de fonction utilisateur, nous devons supprimer la clé "api_secret" des lignes:

    function getCurrentUser(req, res, next) { // user function
    var userId = res.locals.userId;
    console.log(userId)
    db.runSQLWithParams("select * from users where id = $1", [userId], function(err, rows) {
      if(err){
        console.log(err)
      }
      var responseObject = {
        _embedded: rows,
      }
      responseObject._embedded[0].api_secret = undefined
      // console.log(api);
      // console.log(responseObject);
      res.json(responseObject);
    }); 
}

La fonction ci-dessus renvoie l'objet ci-dessous en tant que réponse JSON avant

 {
    "_embedded": [
        {
            "id": "0123abd-345gfhgjf-dajd4456kkdj",
            "secret_key: "secret",
            "email": "[email protected]",
            "created": "2020-08-18T00:13:16.077Z"
        }
    ]
}

Après avoir ajouté cette ligne, responseObject._embedded[0].api_secret = undefinedil donne le résultat ci-dessous en tant que réponse JSON:

{
        "_embedded": [
            {
                "id": "0123abd-345gfhgjf-dajd4456kkdj",
                "email": "[email protected]",
                "created": "2020-08-18T00:13:16.077Z"
            }
        ]
    }
akshay_sushir
la source
0

Le chemin le plus court dans ES6:

array.forEach(e => {delete e.someKey});
Idan
la source
-4

var array = [{"bad": "something", "good":"something"},{"bad":"something", "good":"something"}];
var results = array.map(function(item){
  return {good : item["good"]}
});
console.log(JSON.stringify(results));

hk_y
la source
Pouvez-vous expliquer votre solution?
sg7
Map est une nouvelle structure de données dans JavaScript ES6. Le lien ci-joint peut vous aider. hackernoon.com/what-you-should-know-about-es6-maps-dc66af6b9a1e
hk_y
cette solution n'est pas bonne si vous avez de nombreux accessoires dans vos articles.
Koop4
Oui! J'ai essayé de fournir une approche différente.
hk_y