web-dev-qa-db-fra.com

Filtrer les propriétés des objets en fonction de la valeur

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,
}
16
user3598395

Avant Lodash 4.0

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

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);
24
Retsam

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);

Voir Object.keys() et Array.prototype.reduce()

16
canon

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é.

1
Adam Boduch

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.

1
Jonas

A partir de lodash 4, nous pouvons utiliser pickBy () pour obtenir uniquement la valeur égale à true.

const active = _.keys(_.pickBy(object));
0
Subrata Sarkar