web-dev-qa-db-fra.com

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

J'ai un objet avec des clés et je veux ne garder que certaines des clés avec leur valeur?

J'ai essayé avec filter:

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

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

console.log(result);

Mais cela imprime un tableau:

[111, 222]

Ce qui n'est pas ce que je veux.

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

Démo en direct: http://jsbin.com/moqufevigo/1/edit?js,output

151
Freewind

Lodash a une fonction _.pickBy 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>_
240
serg10

Il suffit de changer le filtre en omisBy

 var result = _.omitBy(data, function(value, key) {
     return !key.startsWith("a");
 })
34

Voici un exemple utilisant lodash 4.x:

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

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

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

Une façon 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
}

filterByKeys(myObject, ['a', 'd', 'e']) // {a: 1, d: null}
2
thomax