Ini adalah sesuatu yang lebih ramping, meskipun itu tidak menghindari mengulangi daftar bidang. Ia menggunakan "perusakan parameter" untuk menghindari kebutuhan akan v
parameter.
({id, title}) => ({id, title})
(Lihat contoh runnable dalam jawaban lain ini ).
Solusi @ EthanBrown lebih umum. Berikut ini adalah versi yang lebih idiomatis yang menggunakan Object.assign
, dan menghitung properti ( [p]
bagian):
function pick(o, ...props) {
return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]})));
}
Jika kita ingin melestarikan atribut properti, seperti configurable
dan getter dan setter, sementara juga menghilangkan properti yang tidak dapat dihitung, maka:
function pick(o, ...props) {
var has = p => o.propertyIsEnumerable(p),
get = p => Object.getOwnPropertyDescriptor(o, p);
return Object.defineProperties({},
Object.assign({}, ...props
.filter(prop => has(prop))
.map(prop => ({prop: get(props)})))
);
}
Object.assign
; es6 seperti pohon Natal dengan begitu banyak hadiah di bawahnya aku masih menemukan hadiah berbulan-bulan setelah liburanfilter(...).map(prop => ({[prop]: get(prop)})))
?pick()
implementasi pertama Anda, Anda juga bisa melakukan sesuatu sepertireturn props.reduce((r, prop) => (r[prop] = o[prop], r), {})
undefined
. Terkadang itu penting. Selain itu, ide bagus.Saya tidak berpikir ada cara untuk membuatnya jauh lebih kompak daripada jawaban Anda (atau torazburo), tetapi pada dasarnya apa yang Anda coba lakukan adalah meniru operasi Underscore
pick
. Akan cukup mudah untuk mengimplementasikannya kembali di ES6:Maka Anda memiliki fungsi berguna yang dapat digunakan kembali:
sumber
pick
fungsi sekali, dan Anda dapat memilih properti yang Anda inginkan dan tidak akan menggandakannya.hasOwnProperty
? Jika bidang dipilih secara manual, bahkanin
tampaknya lebih sesuai; Meskipun saya akan pergi untuk menghilangkan cek sepenuhnya dan biarkan mereka defaultundefined
.Trik untuk memecahkan ini sebagai satu-liner adalah membalik pendekatan yang diambil: Daripada memulai dari objek asli
orig
, seseorang dapat mulai dari kunci yang ingin mereka ekstrak.Menggunakan
Array#reduce
satu kemudian dapat menyimpan setiap kunci yang diperlukan pada objek kosong yang dilewatkan sebagai fungsiinitialValue
untuk kata.Seperti itu:
sumber
Solusi sedikit lebih pendek menggunakan operator koma:
sumber
pick
fungsi lain di utas ini:pick({ name: 'John', age: 29, height: 198 }, 'name', 'age')
Proposal objek rest / spread properti TC39 akan membuat ini cukup apik:
(Ini memang memiliki kelemahan dalam membuat
x
dany
variabel yang mungkin tidak Anda butuhkan.)sumber
omit
, tetapi tidakpick
let { a, b } as z = { x: 1, y: 2, a: 3, b: 4 }
Anda dapat menggunakan perusakan objek untuk mengekstrak properti dari objek yang ada dan menetapkannya ke variabel dengan nama yang berbeda - bidang objek yang awalnya kosong.
sumber
ES6 adalah spesifikasi terbaru pada saat pertanyaan itu ditulis. Seperti dijelaskan dalam jawaban ini , pengambilan kunci secara signifikan lebih pendek di ES2019 daripada di ES6:
sumber
Saat ini ada proposal untuk meningkatkan sintaksis steno objek JavaScript, yang akan memungkinkan "memetik" properti bernama tanpa pengulangan:
Sayangnya, proposal tersebut sepertinya tidak akan kemana-mana dalam waktu dekat. Terakhir diedit pada bulan Juli 2017 dan masih konsep pada Tahap 0 , menunjukkan penulis mungkin telah membuang atau melupakannya.
ES5 dan sebelumnya (mode non-ketat)
Tulisan singkat yang mungkin saya pikirkan melibatkan fitur bahasa kuno yang tidak digunakan lagi oleh orang lain:
with
pernyataan dilarang dalam mode ketat, membuat pendekatan ini tidak berguna untuk 99,999% dari JavaScript modern. Sedikit memalukan, karena ini adalah satu-satunya penggunaan yang layak untukwith
fitur ini. 😀sumber
Saya memiliki mirip dengan solusi Ethan Brown, tetapi bahkan lebih pendek -
pick
berfungsi. Fungsi lainpick2
sedikit lebih lama (dan lebih lambat), tetapi memungkinkan untuk mengubah nama properti dengan cara yang mirip dengan ES6.Berikut ini contoh penggunaannya:
sumber
Saya memerlukan solusi ini tetapi saya tidak tahu apakah kunci yang diusulkan tersedia. Jadi, saya mengambil jawaban @torazaburo dan ditingkatkan untuk kasus penggunaan saya:
sumber
terinspirasi oleh pendekatan pengurangan https://stackoverflow.com/users/865693/shesek :
pemakaian:
pick({ model : 'F40', manufacturer: 'Ferrari', productionYear: 1987 }, 'model', 'productionYear')
menghasilkan:{model: "F40", productionYear: 1987}
sumber