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?

Freewind
la source

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>

serg10
la source
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>

Krystian Jankowski
la source
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>

PaulMest
la source
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)

thomax
la source