Supprimer vide propriétés / falsy valeurs de l'Objet avec Underscore.js
J'ai un objet avec plusieurs propriétés. Je voudrais enlever toutes les propriétés qui ont falsy valeurs.
Ceci peut être réalisé avec compact
sur les tableaux, mais ce que sur les objets?
- Pour éviter de copier-coller ceci dans l'ensemble des référentiels, vous pouvez utiliser Bit importer ce composant (qui a 3 tests passant & licence MIT). Vous pouvez également essayer de ce package NPM (qui pourrait être trop pour une petite partie).
Vous devez vous connecter pour publier un commentaire.
Vous pourriez faire votre propre trait de soulignement plugin (mixin) :
Et ensuite l'utiliser comme un natif de soulignement méthode :
Mise à jour
Comme @AndreiNeculau souligné, ce mixin affecte l'objet d'origine, alors que l'original
compact
trait de soulignement méthode renvoie une copie de la matrice.Pour résoudre ce problème et faire de notre
compactObject
se comportent plus comme c'est cousin, voici une mise à jour mineure:_.compact
. Il va supprimer les propriétés, plutôt que de créer un clone simple avec truthy valeurs seulement. Voir stackoverflow.com/a/19750822/465684 ci-dessousdelete
est généralement pas recommandée, car elle expose immédiatement des propriétés ayant le même nom de la chaîne de prototype et également les performances de nuit, en raison de "caché classes" (V8) - le changement de la structure de l'objet cause le moteur pour faire du travail supplémentaire. Le meilleur et le plus court de solution serait_.pick(o, _.identity)
.Depuis Soulignent la version 1.7.0, vous pouvez utiliser
_.choisir
:Explication
Le deuxième paramètre à
_.pick
peut être une fonction de prédicat de sélection des valeurs. Valeurs pour lesquelles le prédicat retourne truthy sont repris, et les valeurs pour lesquelles le prédicat retourne falsy sont ignorés._.identity
est une fonction d'assistance qui retourne son premier argument, ce qui signifie qu'il fonctionne aussi comme une fonction de prédicat qui sélectionne truthy valeurs et rejette falsy ceux. Le trait de Soulignement de la bibliothèque est également livré avec un tas d'autres prédicats, par exemple_.pick(sourceObj, _.isBoolean)
serait de ne retenir que les propriétés booléennes.Si vous utilisez cette technique, vous souhaitez peut-être un peu plus expressif:
Soulignent la version 1.6.0 fourni
_.pick
ainsi, mais il n'a pas accepté une fonction de prédicat à la place d'une liste blanche._.identity
fonction, très pratique._.omit(sourceObj, _.isUndefined)
pour ne supprimer que les valeurs non définies (permettant false, null, 0).pick(obj, Boolean)
pour éliminer falsey valeurs, la même approche peut être utilisée lorsquearr.filter(Boolean)
pour nettoyer un tableau à partir d'falsey valeurs..._.pick(sourceObj, prop => prop)
_.pick
travaille avec les noms de propriété, pour que cette fonctionnalité comme mentionné dans le post d'utilisation_.pickBy
0 ? 'true' : 'false'
évalue à'false'
.Quick 'n Clear:
_.omit( source, i => !i );
C'est ce que dit l'inverse de la mode à Emil réponse. De cette façon, à mon humble avis se lit plus claire et la plus explicite.
Un peu moins propre que si vous n'avez pas le luxe de l'ES6:
_.omit( source, function(i){return !i;});
Suppléant:
_.omit( source, _.isEmpty)
À l'aide de
_.isEmpty
, au lieu de_.identity
pour truthiness, également idéalement supprimer les vides des tableaux et des objets de la collection et peut-être malencontreusement supprimer les numéros et les dates. Ainsi, le résultat n'est PAS une réponse exacte à la discussion de la question, cependant, il pourrait être utile si vous cherchez à supprimer collections vide.omitBy
. lodash.com/docs#omitBy_.pick(source, i => i);
qui évite la négation_.pickBy(source)
est tout ce qui est nécessaire.Avec lodash de transformer,
var compactObject = _.partialRight(_.pick, _.identity);
_.pickBy
au lieu de_.pick
)_.pickBy(object)
est tout ce que vous devez.keys
et.forEach
.forEach
méthode de JSVous pouvez créer un clone simple:
pour objet, utilisez la touche supprimer.
Soudain, j'ai besoin de créer une fonction pour supprimer récursivement faux-cil. J'espère que cette aide. Je suis en utilisant Lodash.
Alors vous pouvez l'utiliser:
À ajouter à gion_13 réponse:
Celle-ci crée un nouvel objet et ajoute des clés et des valeurs au lieu de tout le clonage et suppression de paires clé-valeur. Différence mineure.
Mais plus important encore, vérifie explicitement la valeur null et undefined à la place de falsey, ce qui permet de supprimer les paires clé-valeur qui ont false comme valeur.
dans le lodash vous faire comme ceci:
Bien que
_.compact
est documentée pour une utilisation dans des tableaux. Il semble que cela fonctionne pour les objets trop. J'ai juste couru le suivant dans google chrome, opera et firefox consoles:Mise à JOUR: Comme l'échantillon indique l'appel de
_.compact
sur un objet déposer les clés et le retour d'un compacté tableau.