87 votes

Supprimez les propriétés vides / les valeurs fantaisistes des objets avec Underscore.js

J'ai un objet avec plusieurs propriétés. Je voudrais supprimer toutes les propriétés qui ont des valeurs erronées.

Cela peut être réalisé avec compact sur les tableaux, mais qu'en est-il des objets ?

171voto

Emil Lundberg Points 1078

Depuis la version 1.7.0 d'Underscore, vous pouvez utiliser _.pick :

_.pick(sourceObj, _.identity)

Explication

Le deuxième paramètre de l'option _.pick peut être une fonction prédicat permettant de sélectionner des valeurs. Les valeurs pour lesquelles le prédicat renvoie véridique sont choisis, et les valeurs pour lesquelles le prédicat retourne falsy sont ignorés.

choisir _.pick(objet, *keys)

Renvoyer une copie de la objet filtré pour n'avoir que les valeurs de la liste blanche. clés (ou un tableau de clés valides). Accepte alternativement un prédicat indiquant les clés à sélectionner.

_.identity est une fonction auxiliaire qui renvoie son premier argument, ce qui signifie qu'elle fonctionne également comme une fonction prédicat qui sélectionne les valeurs vraies et rejette les valeurs fausses. La bibliothèque Underscore est également fournie avec un grand nombre d'autres prédicats, par exemple _.pick(sourceObj, _.isBoolean) ne conserverait que les propriétés booléennes.

Si vous utilisez souvent cette technique, vous voudrez peut-être la rendre un peu plus expressive :

var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something
pickNonfalsy(sourceObj);

Version Underscore 1.6.0 fournie _.pick également, mais il n'acceptait pas une fonction prédicat au lieu d'une liste blanche.

48voto

gion_13 Points 15594

Vous pouvez créer votre propre plugin underscore (mixin) :

_.mixin({
  compactObject: function(o) {
    _.each(o, function(v, k) {
      if(!v) {
        delete o[k];
      }
    });
    return o;
  }
});

Et ensuite l'utiliser comme une méthode de soulignement native :

var o = _.compactObject({
  foo: 'bar',
  a: 0,
  b: false,
  c: '',
  d: null,
  e: undefined
});

Mise à jour

Comme @AndreiNeculau a souligné ce mixin affecte l'objet d'origine, tandis que l'objet d'origine n'est pas modifié. compact méthode de l'underscore retourne une copie du tableau .
Pour résoudre ce problème et rendre notre compactObject se comporte plus comme si c'était cousin voici une petite mise à jour :

_.mixin({
  compactObject : function(o) {
     var clone = _.clone(o);
     _.each(clone, function(v, k) {
       if(!v) {
         delete clone[k];
       }
     });
     return clone;
  }
});

46voto

Shwaydogg Points 2411

Quick'n Clear : _.omitBy( source, i => !i );

Ceci est énoncé de manière inverse à la réponse d'Emil. Cette façon de faire est plus claire, elle est plus explicite.

Un peu moins propre si vous n'avez pas le luxe de l'ES6 : _.omitBy( source, function(i){return !i;});

Alternatif : _.omitBy( source, _.isEmpty)

Utilisation de _.isEmpty au lieu de _.identity pour la véracité, supprime également les tableaux et les objets vides de la collection et, peut-être, les nombres et les dates. . Le résultat n'est donc PAS une réponse exacte à la question de l'OP, mais il peut être utile pour supprimer les collections vides.

21voto

rane Points 300

Avec lodash's transformer ,

_.transform(obj, function(res, v, k) {
  if (v) res[k] = v;
});

19voto

Florian Margaine Points 16927
Object.keys(o).forEach(function(k) {
    if (!o[k]) {
        delete o[k];
    }
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X