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
reduceundObject.keys
- Wie (1) in Kombination mit
Object.assign
- Verwenden
mapund Verbreiten der Syntax anstelle vonreduce
- Verwenden von
Object.entriesundObject.fromEntries
1. Verwenden von reduceundObject.keys
Mit reduceund Object.keyszum 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 predicateeine 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 resObjekt 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.assignstattdessen, 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 mapund verbreiten Sie die Syntax anstelle vonreduce
Hier verschieben wir den Object.assignAufruf 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.entriesundObject.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.