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
reduce
etObject.keys
- As (1), en combinaison avec
Object.assign
- Utiliser
map
et diffuser la syntaxe au lieu dereduce
- Utilisation
Object.entries
etObject.fromEntries
1. Utilisation reduce
etObject.keys
Avec reduce
et Object.keys
pour 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 predicate
doit ê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.filter
fonctionne.
2. Comme (1), en combinaison avec Object.assign
Dans la solution ci-dessus, l' opérateur virgule est utilisé dans la reduce
partie pour renvoyer l' res
objet 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.assign
place, 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 map
et diffuser la syntaxe au lieu dereduce
Ici, nous déplaçons l' Object.assign
appel 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.entries
etObject.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.