web-dev-qa-db-fra.com

Supprimer les propriétés/valeurs falsy vides de Object with Underscore.js

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

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

81
user1082754

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

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

Et utilisez-le ensuite comme méthode de soulignement native: 

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

Mettre à jour

Comme @AndreiNeculau _ { souligné , ce mixin affecte l'objet d'origine, tandis que la méthode compact underscore originale retourne une copie du tableau .
Pour résoudre ce problème et faire en sorte que notre compactObject se comporte davantage comme s'il s'agissait de cousin, voici une mise à jour mineure: 

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

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

_.pick(sourceObj, _.identity)

Explication

Le second paramètre à _.pick peut être une fonction de prédicat pour la sélection de valeurs. Les valeurs pour lesquelles le prédicat renvoie vérité sont sélectionnées et les valeurs pour lesquelles le prédicat renvoie falsy sont ignorées.

pick _.pick (objet, touches *)

Retourne une copie de object, filtrée pour n'avoir que des valeurs pour les keys de la liste blanche (ou un tableau de clés valides). Vous pouvez également accepter un prédicat indiquant les clés à sélectionner.

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

Si vous utilisez beaucoup 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);

Underscore la version 1.6.0 fournissait également _.pick, mais elle n’acceptait pas de fonction de prédicat au lieu d’une liste blanche.

166
Emil Lundberg

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

Ceci est indiqué de manière inverse à la réponse d'Emil. De cette façon, mon humble avis est plus clair; c'est plus explicite.

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

Autre: _.omit( source, _.isEmpty)

L'utilisation de_.isEmpty, au lieu de _.identity pour plus de vérité, supprimera également les tableaux et objets vides de la collection et supprimera peut-être les nombres et les dates . Ainsi, le résultat N'EST PAS une réponse exacte à la question du PO, mais cela pourrait être utile pour supprimer des collections vides.

43
Shwaydogg

Avec lodash's transform ,

_.transform(obj, function(res, v, k) {
  if (v) res[k] = v;
});
21
raine
Object.keys(o).forEach(function(k) {
    if (!o[k]) {
        delete o[k];
    }
});
17
Florian Margaine

Vous pouvez créer un clone peu profond:

_(obj).reduce(function(a,v,k){ 
     if(v){ a[k]=v; } 
     return a; 
},{});
9
webwise

pour utiliser un objet delete.

for(var k in obj){

  if(obj.hasOwnProperty(k) && !obj[k]){
    delete obj[k];
  }
}
5
Anoop

Du coup, il me fallut créer une fonction pour supprimer récursivement les faux J'espère que ça aide. J'utilise Lodash.

var removeFalsies = function (obj) {
    return _.transform(obj, function (o, v, k) {
        if (v && typeof v === 'object') {
            o[k] = _.removeFalsies(v);
        } else if (v) {
            o[k] = v;
        }
    });
};

_.mixin({ 'removeFalsies': removeFalsies });

Ensuite, vous pouvez l'utiliser:

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

// {
//   foo: 'bar',
//   obj: {
//     foo: 'bar'
//   }
// }
4
Marco Godínez

Pour ajouter à la réponse de gion_13:

_.mixin({
  compactObject : function(o) {
     var newObject = {};
     _.each(o, function(v, k) {
       if(v !== null && v !== undefined) {
         newObject[k] = v
       }
     });
     return newObject;
  }
});

Celui-ci crée un nouvel objet et ajoute des clés et des valeurs au lieu de tout cloner et de supprimer des paires clé-valeur. Différence mineure.

Mais plus important encore, vérifie explicitement les valeurs null et undefined au lieu de falsey, ce qui supprimera les paires clé-valeur dont la valeur est false.

1
Geoff Lee

dans le lodash vous faites comme ceci:

_.pickBy(object, _.identity);
0
Hydrogen