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 ?
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 ?
Depuis la version 1.7.0 d'Underscore, vous pouvez utiliser _.pick
:
_.pick(sourceObj, _.identity)
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.
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
});
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;
}
});
_.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;});
_.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.
Avec lodash's transformer ,
_.transform(obj, function(res, v, k) {
if (v) res[k] = v;
});
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.