Comment filtrer les clés d'un objet avec lodash?


178

J'ai un objet avec des clés, et je souhaite ne conserver que certaines des clés avec leur valeur?

J'ai essayé avec filter:

const data = {
  aaa: 111,
  abb: 222,
  bbb: 333
};

const result = _.filter(data, (value, key) => key.startsWith("a"));

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

Mais il imprime un tableau:

[111, 222]

Ce n'est pas ce que je veux.

Comment faire avec lodash? Ou autre chose si lodash ne fonctionne pas?

Réponses:


285

Lodash a une _.pickByfonction qui fait exactement ce que vous recherchez.

var thing = {
  "a": 123,
  "b": 456,
  "abc": 6789
};

var result = _.pickBy(thing, function(value, key) {
  return _.startsWith(key, "a");
});

console.log(result.abc) // 6789
console.log(result.b)   // undefined
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>


9
Il semble que cela soit cassé dans la version 4 de lodash, et le nouveau prédicat _.pickBy n'est invoqué qu'avec valeur et non clé. Boo :( ... Je suppose que vous pouvez enchaîner _.pick et _.pickBy (en fait non, vous ne pouvez pas obtenir les mêmes fonctionnalités)
SDK

3
Cela ne fonctionne plus à partir du dernier Lodash, juste un FYI
Eudis Duran

8
@EudisDuran vous devez utiliser.pickBy
apfelbox

semble avoir été corrigé avec la dernière version

39

Changez simplement le filtre pour omettre

const data = { aaa: 111, abb: 222, bbb: 333 };
const result = _.omitBy(data, (value, key) => !key.startsWith("a"));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>


Cela n'imprime pas encore un tableau?
Mr_Green

4
Merci! Et je pense que nous pouvons utiliser_.pick
Freewind

Cela ne fonctionne plus à partir du dernier lodash, juste un FYI
Eudis Duran

18

Voici un exemple utilisant lodash4.x:

const data = {
  aaa: 111,
  abb: 222,
  bbb: 333
};

const result = _.pickBy(data, (value, key) => key.startsWith("a"));

console.log(result);
// Object { aaa: 111, abb: 222 }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
<strong>Open your javascript console to see the output.</strong>


4

Un moyen non lodash de résoudre ce problème de manière assez lisible et efficace:

function filterByKeys(obj, keys = []) {
  const filtered = {}
  keys.forEach(key => {
    if (obj.hasOwnProperty(key)) {
      filtered[key] = obj[key]
    }
  })
  return filtered
}

const myObject = {
  a: 1,
  b: 'bananas',
  d: null
}

const result = filterByKeys(myObject, ['a', 'd', 'e']) // {a: 1, d: null}
console.log(result)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.