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
reduce
danObject.keys
- Seperti (1), dalam kombinasi dengan
Object.assign
- Menggunakan
map
dan menyebar sintaks alih-alihreduce
- Menggunakan
Object.entries
danObject.fromEntries
1. Menggunakan reduce
danObject.keys
Dengan reduce
dan Object.keys
untuk 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 predicate
harus merupakan kondisi inklusi (bertentangan dengan kondisi pengecualian OP yang digunakan), sehingga sesuai dengan cara Array.prototype.filter
kerjanya.
2. As (1), dalam kombinasi dengan Object.assign
Dalam solusi di atas operator koma digunakan di reduce
bagian untuk mengembalikan res
objek 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.assign
sebagai 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 map
dan menyebarkan sintaks sebagai gantireduce
Di sini kita memindahkan Object.assign
panggilan 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.entries
danObject.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.