Her şeyden önce, uzatmak kötü bir uygulama olarak kabul edilirObject.prototype
. Bunun yerine, üzerinde yarar fonksiyonu olarak sizin özelliği sağlamak Object
zaten var tıpkı Object.keys
, Object.assign
, Object.is
, ... vb.
Burada çeşitli çözümler sunuyorum:
- kullanılması
reduce
veObject.keys
- (1) 'e göre
Object.assign
map
Sözdizimi kullanmak ve yaymak yerinereduce
- kullanılması
Object.entries
veObject.fromEntries
1. reduce
ve öğelerini kullanmaObject.keys
İle reduce
ve Object.keys
arzu 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 predicate
bir 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:reduce
res
Object.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. map
Sö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.entries
ve öğ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.