Pertama-tama, itu dianggap praktik buruk untuk diperluasObject.prototype . Sebaliknya, menyediakan fitur Anda sebagai fungsi utilitas pada Object, seperti ada sudah berada Object.keys, Object.assign, Object.is, ... dll.
Saya berikan di sini beberapa solusi:
- Menggunakan
reducedanObject.keys
- Seperti (1), dalam kombinasi dengan
Object.assign
- Menggunakan
mapdan menyebar sintaks alih-alihreduce
- Menggunakan
Object.entriesdanObject.fromEntries
1. Menggunakan reducedanObject.keys
Dengan reducedan Object.keysuntuk menerapkan filter yang diinginkan (menggunakan sintaks panah 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);
Perhatikan bahwa dalam kode di atas predicateharus merupakan kondisi inklusi (bertentangan dengan kondisi pengecualian OP yang digunakan), sehingga sesuai dengan cara Array.prototype.filterkerjanya.
2. As (1), dalam kombinasi dengan Object.assign
Dalam solusi di atas operator koma digunakan di reducebagian untuk mengembalikan resobjek yang bermutasi . Tentu saja ini dapat ditulis sebagai dua pernyataan, bukan satu ungkapan, tetapi yang terakhir lebih ringkas. Untuk melakukannya tanpa operator koma, Anda bisa menggunakan Object.assignsebagai gantinya, yang tidak mengembalikan objek bermutasi:
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. Menggunakan mapdan menyebarkan sintaks sebagai gantireduce
Di sini kita memindahkan Object.assignpanggilan keluar dari loop, sehingga hanya dibuat sekali, dan memberikannya kunci individual sebagai argumen terpisah (menggunakan sintaksis penyebaran ):
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. Menggunakan Object.entriesdanObject.fromEntries
Ketika solusi menerjemahkan objek ke array perantara dan kemudian mengubahnya kembali menjadi objek biasa, akan berguna untuk menggunakan Object.entries(ES2017) dan sebaliknya (yaitu membuat objek dari array pasangan kunci / nilai ) dengan Object.fromEntries( ES2019).
Ini mengarah ke metode "satu garis" pada 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);
Fungsi predikat mendapat pasangan kunci / nilai sebagai argumen di sini, yang sedikit berbeda, tetapi memungkinkan lebih banyak kemungkinan dalam logika fungsi predikat.