Her şeyden önce, uzatmak kötü bir uygulama olarak kabul edilirObject.prototype . Bunun yerine, üzerinde yarar fonksiyonu olarak sizin özelliği sağlamak Objectzaten var tıpkı Object.keys, Object.assign, Object.is, ... vb.
Burada çeşitli çözümler sunuyorum:
- kullanılması
reduceveObject.keys
- (1) 'e göre
Object.assign
mapSözdizimi kullanmak ve yaymak yerinereduce
- kullanılması
Object.entriesveObject.fromEntries
1. reduceve öğelerini kullanmaObject.keys
İle reduceve Object.keysarzu edilen filtre (ES6 kullanarak uygulamak için ok sözdizimi ):
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);
Yukarıdaki kodda predicatebir ekleme koşulu olması gerekir ( kullanılan OP hariç tutma koşulu aksine ), böylece nasıl Array.prototype.filterçalışır doğrultusunda .
2. (1) gibi, ile birlikte Object.assign
Yukarıdaki çözümde , mutasyona uğramış nesneyi döndürmek için parçada virgül operatörü kullanılır . Bu elbette bir ifade yerine iki ifade olarak yazılabilir, ancak ikincisi daha özlüdür. Virgül operatörü olmadan yapmak için, kullanabilirsiniz , hangi yerine gelmez mutasyona uğramış nesneyi döndürmek:reduceresObject.assign
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. mapSözdizimi kullanmak ve yaymak yerinereduce
Burada Object.assignçağrıyı döngüden çıkarıyoruz, bu yüzden sadece bir kez yapılır ve ayrı anahtarlar olarak ayrı anahtarlar olarak iletilir ( yayılma sözdizimini kullanarak ):
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. Object.entriesve öğelerini kullanmaObject.fromEntries
Çözelti, bir ara dizi nesne çevirir ve ardından düz bir nesne için bu geri dönüştürür gibi, kullanmak yararlı olacaktır Object.entries(diğer bir deyişle (ES2017) ve ters anahtar / değer çiftleri bir diziden bir nesne oluşturmak birlikte) Object.fromEntries( ES2019).
Bu "tek astarlı" yönteme şu yolla götürür 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);
Yüklem işlevi burada bir anahtar / değer çifti argüman olarak alır, bu biraz farklıdır, ancak yüklem işlevinin mantığında daha fazla olasılık sağlar.