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?


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é.

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)

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; 
});

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']);
});

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;

3

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

array.map(({good}) => ({good}))

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,
                    }

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);

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)


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);


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": "abcd@email.com",
            "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": "abcd@email.com",
                "created": "2020-08-18T00:13:16.077Z"
            }
        ]
    }

0

Le chemin le plus court dans ES6:

array.forEach(e => {delete e.someKey});

-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));


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.