Destrukturisasi ES6
Sintaksis restrukturisasi memungkinkan untuk merusak dan menggabungkan kembali suatu objek, dengan parameter fungsi atau variabel.
Batasannya adalah bahwa daftar kunci sudah ditentukan sebelumnya, mereka tidak dapat didaftar sebagai string, seperti yang disebutkan dalam pertanyaan. Destrukturisasi menjadi lebih rumit jika kuncinya adalah non-alfanumerik, misalnya foo_bar
.
The downside adalah bahwa ini mengharuskan untuk menduplikasi daftar kunci, ini menghasilkan kode verbose jika daftar panjang. Karena merusak duplikat sintaksis objek objek dalam kasus ini, daftar dapat disalin dan ditempel sebagaimana adanya.
Keuntungannya adalah bahwa itu adalah solusi yang alami untuk ES6.
IIFE
let subset = (({ foo, bar }) => ({ foo, bar }))(obj); // dupe ({ foo, bar })
Variabel sementara
let { foo, bar } = obj;
let subset = { foo, bar }; // dupe { foo, bar }
Daftar string
Daftar sewenang-wenang dari kunci yang dipilih terdiri dari string, sesuai dengan pertanyaan. Ini memungkinkan untuk tidak menentukan sebelumnya dan menggunakan variabel yang berisi nama-nama kunci, seperti pick(obj, 'foo', someKey, ...moreKeys)
.
Satu kalimat menjadi lebih pendek pada setiap edisi JS.
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] }), {});
Atau dengan operator koma:
let subset = Object.keys(obj)
.filter(key => ['foo', 'bar'].indexOf(key) >= 0)
.reduce((obj2, key) => (obj2[key] = obj[key], obj2), {});
ES2019
ECMAScript 2017 memiliki Object.entries
dan Array.prototype.includes
, ECMAScript 2019 memiliki Object.fromEntries
, mereka dapat di-polyfilled ketika dibutuhkan dan membuat tugas lebih mudah:
let subset = Object.fromEntries(
Object.entries(obj)
.filter(([key]) => ['foo', 'bar'].includes(key))
)
Satu kalimatpick
dapat ditulis ulang sebagai fungsi pembantu yang mirip dengan Lodash atau di omit
mana daftar kunci dilewatkan melalui argumen:
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 }
Catatan tentang kunci yang hilang
Perbedaan utama antara perusakan dan fungsi konvensional seperti Lodash pick
adalah bahwa perusakan mencakup kunci pilihan yang tidak ada dengan undefined
nilai dalam subset:
(({ foo, bar }) => ({ foo, bar }))({ foo: 1 }) // { foo: 1, bar: undefined }
Perilaku ini mungkin diinginkan atau tidak. Itu tidak dapat diubah untuk merusak sintaksis.
Sementara pick
dapat diubah untuk memasukkan kunci yang hilang dengan mengulangi daftar kunci yang dipilih sebagai gantinya:
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 }