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?

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>


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>


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>


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)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.