Tout d'abord, il est considéré comme une mauvaise pratique de s'étendreObject.prototype . Au lieu de cela, indiquez votre fonction en fonction d'utilité sur Object, comme il y a déjà Object.keys, Object.assign, Object.is, ... etc.
Je propose ici plusieurs solutions:
- Utilisation
reduceetObject.keys
- As (1), en combinaison avec
Object.assign
- Utiliser
mapet diffuser la syntaxe au lieu dereduce
- Utilisation
Object.entriesetObject.fromEntries
1. Utilisation reduceetObject.keys
Avec reduceet Object.keyspour implémenter le filtre souhaité (en utilisant la syntaxe des flèches ES6 ):
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);
Notez que dans le code ci-dessus predicatedoit être une condition d' inclusion (contrairement à la condition d' exclusion utilisée par l'OP), afin qu'elle corresponde à la façon dont Array.prototype.filterfonctionne.
2. Comme (1), en combinaison avec Object.assign
Dans la solution ci-dessus, l' opérateur virgule est utilisé dans la reducepartie pour renvoyer l' resobjet muté . Cela pourrait bien sûr être écrit comme deux déclarations au lieu d'une seule expression, mais cette dernière est plus concise. Pour le faire sans l'opérateur virgule, vous pouvez utiliser à la Object.assignplace, qui ne retourne l'objet muté:
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. Utiliser mapet diffuser la syntaxe au lieu dereduce
Ici, nous déplaçons l' Object.assignappel hors de la boucle, donc il n'est fait qu'une seule fois, et lui passons les clés individuelles comme arguments séparés (en utilisant la syntaxe de propagation ):
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. Utilisation Object.entriesetObject.fromEntries
Comme la solution traduit l'objet en un tableau intermédiaire, puis le convertit en un objet simple, il serait utile d'utiliser Object.entries(ES2017) et l'opposé (c'est-à-dire créer un objet à partir d'un tableau de paires clé / valeur ) avec Object.fromEntries( ES2019).
Cela conduit à cette méthode "one-liner" sur 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);
La fonction de prédicat obtient ici une paire clé / valeur comme argument, ce qui est un peu différent, mais permet plus de possibilités dans la logique de la fonction de prédicat.