Zuallererst wird es als schlechte Praxis angesehen, zu verlängernObject.prototype
. Stattdessen geben Sie Ihre Funktion als Nutzenfunktion auf Object
, so wie es bereits sind Object.keys
, Object.assign
, Object.is
, ... etc.
Ich biete hier verschiedene Lösungen an:
- Verwenden von
reduce
undObject.keys
- Wie (1) in Kombination mit
Object.assign
- Verwenden
map
und Verbreiten der Syntax anstelle vonreduce
- Verwenden von
Object.entries
undObject.fromEntries
1. Verwenden von reduce
undObject.keys
Mit reduce
und Object.keys
zum Implementieren des gewünschten Filters (unter Verwendung der ES6- Pfeilsyntax ):
Object.filter = (obj, predicate) =>
Object.keys(obj)
.filter( key => predicate(obj[key]) )
.reduce( (res, key) => (res[key] = obj[key], res), {} );
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, score => score > 1);
console.log(filtered);
Beachten Sie, dass der obige Code predicate
eine Einschlussbedingung sein muss (im Gegensatz zu der Ausschlussbedingung , die das OP verwendet), damit sie mit der Funktionsweise Array.prototype.filter
übereinstimmt.
2. Wie (1) in Kombination mit Object.assign
In der obigen Lösung wird der Kommaoperator in der verwendetreduce
Teil verwendet, um das mutierte res
Objekt zurückzugeben. Dies könnte natürlich als zwei Aussagen anstelle eines Ausdrucks geschrieben werden, aber letzterer ist prägnanter. Um es ohne Komma - Operator zu tun, könnten Sie Object.assign
stattdessen, die nicht das mutierte Objekt zurückgeben:
Object.filter = (obj, predicate) =>
Object.keys(obj)
.filter( key => predicate(obj[key]) )
.reduce( (res, key) => Object.assign(res, { [key]: obj[key] }), {} );
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, score => score > 1);
console.log(filtered);
3. Verwenden map
und verbreiten Sie die Syntax anstelle vonreduce
Hier verschieben wir den Object.assign
Aufruf aus der Schleife, sodass er nur einmal ausgeführt wird, und übergeben ihm die einzelnen Schlüssel als separate Argumente (unter Verwendung der Spread-Syntax ):
Object.filter = (obj, predicate) =>
Object.assign(...Object.keys(obj)
.filter( key => predicate(obj[key]) )
.map( key => ({ [key]: obj[key] }) ) );
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, score => score > 1);
console.log(filtered);
4. Verwenden von Object.entries
undObject.fromEntries
Da die Lösung das Objekt in ein Zwischenarray übersetzt und dieses dann wieder in ein einfaches Objekt konvertiert, wäre es nützlich, es zu verwenden Object.entries
(ES2017) und das Gegenteil (dh ein Objekt aus einem Array von Schlüssel / Wert-Paaren erstellen ) mit Object.fromEntries
( ES2019).
Es führt zu dieser "Einzeiler" -Methode auf Object
:
Object.filter = (obj, predicate) =>
Object.fromEntries(Object.entries(obj).filter(predicate));
// Example use:
var scores = {
John: 2, Sarah: 3, Janet: 1
};
var filtered = Object.filter(scores, ([name, score]) => score > 1);
console.log(filtered);
Die Prädikatfunktion erhält hier ein Schlüssel / Wert-Paar als Argument, was etwas anders ist, aber mehr Möglichkeiten in der Logik der Prädikatfunktion bietet.