Wie filtere ich Schlüssel eines Objekts mit lodash?

177

Ich habe ein Objekt mit einigen Schlüsseln und möchte nur einige der Schlüssel mit ihrem Wert behalten?

Ich habe versucht mit 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>

Aber es druckt ein Array:

[111, 222]

Welches ist nicht was ich will.

Wie macht man das mit lodash? Oder etwas anderes, wenn lodash nicht funktioniert?

Freilauf
quelle

Antworten:

283

Lodash hat eine _.pickByFunktion, die genau das tut, was Sie suchen.

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
quelle
9
Es scheint, dass dies in lodash Version 4 nicht funktioniert, und das neue Prädikat _.pickBy wird nur mit dem Wert und nicht mit dem Schlüssel aufgerufen. Boo :( ... Ich nehme an, Sie können _.pick und _.pickBy verketten (eigentlich nein, Sie können nicht die gleiche Funktionalität erhalten)
SDK
3
Dies funktioniert nicht mehr ab dem neuesten Lodash, nur zu Ihrer Information
Eudis Duran
8
@EudisDuran müssen Sie verwenden.pickBy
Apfelbox
scheint mit der neuesten Version
39

Ändern Sie einfach den Filter in omitBy

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
quelle
Druckt dies nicht immer noch ein Array?
Mr_Green
4
Vielen Dank! Und ich denke, wir können verwenden_.pick
Freewind
Dies funktioniert nicht mehr ab dem letzten Lodash, nur ein FYI
Eudis Duran
18

Hier ist ein Beispiel mit 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
quelle
4

Ein nicht-lodash-Weg, um dies auf eine ziemlich lesbare und effiziente Weise zu lösen:

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
quelle