ES6 yıkımı
Yıkım sözdizimi , bir nesneyi işlev parametreleri veya değişkenlerle yıkmaya ve yeniden birleştirmeye izin verir.
Sınırlama, anahtar listesinin önceden tanımlanmış olması, sorudan bahsedildiği gibi dize olarak listelenememesidir. Bir anahtarın alfasayısal olmadığı durumlarda yıkım daha karmaşık hale gelir, ör foo_bar
.
Dezavantajı, bunun bir anahtar listesinin çoğaltılmasını gerektirmesidir, bir listenin uzun olması durumunda ayrıntılı kodla sonuçlanır. Bu durumda yıkım, nesne değişmez sözdizimini çoğalttığından, bir liste olduğu gibi kopyalanabilir ve yapıştırılabilir.
Bunun tersi, ES6 için doğal olan performanslı bir çözümdür.
Hayatta
let subset = (({ foo, bar }) => ({ foo, bar }))(obj); // dupe ({ foo, bar })
Geçici değişkenler
let { foo, bar } = obj;
let subset = { foo, bar }; // dupe { foo, bar }
Dizelerin bir listesi
Seçilmiş anahtarların keyfi listesi, sorunun gerektirdiği gibi dizelerden oluşur. Bu, onları önceden tanımlamamıza ve anahtar adları içeren değişkenler kullanmanıza izin verir pick(obj, 'foo', someKey, ...moreKeys)
.
Her JS sürümünde bir astar daha kısalır.
ES5
var subset = Object.keys(obj)
.filter(function (key) {
return ['foo', 'bar'].indexOf(key) >= 0;
})
.reduce(function (obj2, key) {
obj2[key] = obj[key];
return obj2;
}, {});
ES6
let subset = Object.keys(obj)
.filter(key => ['foo', 'bar'].indexOf(key) >= 0)
.reduce((obj2, key) => Object.assign(obj2, { [key]: obj[key] }), {});
Veya virgül operatörü ile:
let subset = Object.keys(obj)
.filter(key => ['foo', 'bar'].indexOf(key) >= 0)
.reduce((obj2, key) => (obj2[key] = obj[key], obj2), {});
ES2019
ECMAScript 2017 , ECMAScript 2019'a sahiptir Object.entries
ve gerektiğinde çoklu doldurulabilir ve görevi kolaylaştırır:Array.prototype.includes
Object.fromEntries
let subset = Object.fromEntries(
Object.entries(obj)
.filter(([key]) => ['foo', 'bar'].includes(key))
)
Tek satırlıkpick
, Lodash'a benzer bir yardımcı işlev olarak veya omit
anahtar listesinin bağımsız değişkenlerden geçirildiği şekilde yeniden yazılabilir :
let pick = (obj, ...keys) => Object.fromEntries(
Object.entries(obj)
.filter(([key]) => keys.includes(key))
);
let subset = pick({ foo: 1, qux: 2 }, 'foo', 'bar'); // { foo: 1 }
Eksik tuşlar hakkında bir not
Yıkım ve geleneksel Lodash benzeri pick
işlev arasındaki en büyük fark, yıkımın undefined
bir alt kümede değeri olan var olmayan seçilmiş anahtarlar içermesidir :
(({ foo, bar }) => ({ foo, bar }))({ foo: 1 }) // { foo: 1, bar: undefined }
Bu davranış istenebilir veya istenmeyebilir. Yıkım sözdizimi için değiştirilemez.
İken pick
yerine aldı tuşlarının bir listesini yineleme tarafından anahtarları eksik içerecek şekilde değiştirilebilir:
let inclusivePick = (obj, ...keys) => Object.fromEntries(
keys.map(key => [key, obj[key]])
);
let subset = inclusivePick({ foo: 1, qux: 2 }, 'foo', 'bar'); // { foo: 1, bar: undefined }