Existe-t-il un moyen élégant de filtrer les propriétés de falsey de cet objet avec lodash/underscore? Similaire à la façon dont _.compact(array)
supprime les éléments falsey des tableaux
donc de
{
propA: true,
propB: true,
propC: false,
propD: true,
}
de retour
{
propA: true,
propB: true,
propD: true,
}
Tu veux _.pick
, il prend une fonction en argument et retourne un objet contenant uniquement les clés pour lesquelles cette fonction retourne true. Vous pouvez donc faire:
filtered = _.pick(obj, function(value, key) {return value;})
Ou encore plus succinctement:
filtered = _.pick(obj, _.identity)
Lodash 4.0 a divisé le _.pick
fonction dans _.pick
, qui prend un tableau de propriétés, et _.pickBy
qui prend une fonction. Alors maintenant, ce serait
filtered = _.pickBy(obj, function(value, key) {return value;})
Ou, puisque _.pickBy
utilise par défaut _.identity
comme deuxième argument, il peut simplement s'écrire:
filtered = _.pickBy(obj);
Voici deux options javascript de Vanilla:
A.: Itérer sur les clés de l'objet et delete
celles ayant une valeur de falsey.
var obj = {
propA: true,
propB: true,
propC: false,
propD: true,
};
Object.keys(obj).forEach(key => {
if (!obj[key]) delete obj[key];
});
console.log(obj);
Voir Object.keys()
et Array.prototype.forEach()
B.: Parcourez les clés de l'objet et ajoutez des valeurs véridiques à un nouvel objet.
var obj = {
propA: true,
propB: true,
propC: false,
propD: true,
};
var filteredObj = Object.keys(obj).reduce((p, c) => {
if (obj[c]) p[c] = obj[c];
return p;
}, {});
console.log(filteredObj);
Si vous utilisez lodash, je recommanderais quelque chose comme ceci:
var object = {
propA: true,
propB: true,
propC: false,
propD: true,
};
_.pick(object, _.identity);
// →
// {
// propA: true,
// propB: true,
// propD: true
// }
La fonction pick () génère un nouvel objet qui inclut des propriétés pour lesquelles le rappel renvoie véridique pour. Nous pouvons donc simplement utiliser la fonction identity () comme rappel, car elle ne fera que renvoyer chaque valeur de propriété.
Malheureusement, je ne peux pas encore commenter directement les articles ci-dessus, donc je crée ce message supplémentaire.
Depuis Lodash v4, la fonctionnalité décrite ci-dessus a été déplacée vers _. PickBy . Avec _.identity
par défaut, vous pouvez également modifier votre code en:
var filtered = _.pickBy(obj);
Voir ceci JSBin pour un exemple de travail.
A partir de lodash 4, nous pouvons utiliser pickBy () pour obtenir uniquement la valeur égale à true.
const active = _.keys(_.pickBy(object));