Katakanlah saya punya objek:
{
item1: { key: 'sdfd', value:'sdfd' },
item2: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
}
Saya ingin membuat objek lain dengan memfilter objek di atas sehingga saya memiliki sesuatu seperti.
{
item1: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
}
Saya mencari cara yang bersih untuk mencapai ini menggunakan Es6, jadi operator spread tersedia untuk saya.
filter
ecmascript-6
29er
sumber
sumber
Jawaban:
Jika Anda memiliki daftar nilai yang diizinkan, Anda dapat dengan mudah menyimpannya di objek menggunakan:
Ini menggunakan:
Object.keys
untuk mendaftar semua properti diraw
(data asli), laluArray.prototype.filter
untuk memilih kunci yang ada dalam daftar yang diizinkan, menggunakanArray.prototype.includes
untuk memastikan mereka hadirArray.prototype.reduce
untuk membangun objek baru dengan hanya properti yang diizinkan.Ini akan membuat salinan dangkal dengan properti yang diizinkan (tetapi tidak akan menyalin properti itu sendiri).
Anda juga dapat menggunakan operator penyebaran objek untuk membuat serangkaian objek tanpa memutasikannya (terima kasih kepada rjerue karena menyebutkan ini ):
Untuk keperluan hal-hal sepele, jika Anda ingin menghapus bidang yang tidak diinginkan dari data asli (yang saya tidak akan merekomendasikan melakukannya, karena melibatkan beberapa mutasi buruk), Anda dapat membalikkan
includes
cek seperti:Saya menyertakan contoh ini untuk menunjukkan solusi berbasis mutasi, tetapi saya tidak menyarankan menggunakannya.
sumber
Array.prototype.includes
bukan bagian dari ES6. Ini diperkenalkan dalam ECMAScript 2016 (ES7).Jika Anda baik-baik saja dengan menggunakan sintaks ES6, saya menemukan bahwa cara terbersih untuk melakukan ini, seperti disebutkan di sini dan di sini adalah:
Sekarang,
newData
berisi:Atau, jika Anda memiliki kunci yang disimpan sebagai string:
Dalam kasus terakhir,
[key]
dikonversi menjadiitem2
tetapi karena Anda menggunakanconst
tugas, Anda harus menentukan nama untuk tugas tersebut._
mewakili nilai membuang.Lebih umum:
Ini tidak hanya mengurangi operasi Anda menjadi satu-liner tetapi juga tidak mengharuskan Anda untuk mengetahui apa kunci lainnya (yang ingin Anda pertahankan).
sumber
_
mewakili nilai membuang" di mana ini datang? Pertama kali saya melihatnya_
hanyalah nama variabel valid yang dapat digunakan dalam JS tetapi karena itu cukup banyak tanpa nama, itu benar-benar tidak boleh digunakan dengan cara itu jika Anda ingin menyampaikan maksud. Jadi, ini telah diadopsi sebagai cara untuk menunjukkan variabel yang tidak Anda pedulikan. Inilah diskusi lebih lanjut tentang hal itu: stackoverflow.com/questions/11406823/…filter
danreduce
._
itu tidak masalah, itu hanya nama variabel, Anda dapat mengubah nama itu menjadi apa pun yang Anda inginkanomit
fungsi lodash : lodash.com/docs/4.17.10#omit atau salah satu solusi lain yang diberikan di sini.Cara terbersih yang bisa Anda temukan adalah dengan Lodash # pick
sumber
Tidak ada yang belum dikatakan sebelumnya, tetapi untuk menggabungkan beberapa jawaban untuk jawaban ES6 umum:
sumber
Hanya solusi lain dalam satu baris Modern JS tanpa perpustakaan eksternal .
Saya bermain dengan fitur " Penghancuran ":
sumber
var myNewRaw = (({ item1, item3}) => ({ item1, item3 }))(raw);
MasalahAnda sekarang dapat membuatnya lebih pendek dan sederhana dengan menggunakan metode Object.fromEntries (periksa dukungan browser):
baca lebih lanjut tentang: Object.fromEntries
sumber
Anda dapat menambahkan generik
ofilter
(diimplementasikan dengan generikoreduce
) sehingga Anda dapat dengan mudah menyaring objek dengan cara yang sama dengan array -Kita bisa melihatnya bekerja di sini -
Verifikasi hasil di browser Anda sendiri di bawah ini -
Tampilkan cuplikan kode
Kedua fungsi ini dapat diimplementasikan dengan berbagai cara. Saya memilih untuk melampirkan ke
Array.prototype.reduce
dalamoreduce
tetapi Anda bisa dengan mudah menulis semuanya dari awalsumber
oreduce
, yang pertamaacc
dibayangi di.reduce(acc, k)
, dan diofilter
dalamo
dibayangi -oreduce
disebut dengan variabel yang disebuto
juga - yang mana?ofilter
variabelo
dibayangi tetapi selalu menunjuk ke input var yang sama; itu sebabnya dibayangi di sini, karena itu sama - akumulator (acc
) juga dibayangi karena lebih jelas menunjukkan bagaimana data bergerak melalui lambda;acc
tidak selalu mengikat yang sama , tetapi selalu mewakili kondisi persisten saat ini dari hasil komputasi yang ingin kami kembalikanBeginilah cara saya melakukannya, baru-baru ini:
sumber
Object.assign == ...
Anda bisa menulisconst dummyObj = { ...obj }
danconst target = { ...dummyObj }
. Plus, yang terakhir sama sekali tidak perlu, karena Anda bisa langsung bekerja dengan dummyObj sesudahnya.ok, bagaimana dengan one-liner ini
sumber
Jawaban di sini pasti cocok tetapi mereka agak lambat karena mereka memerlukan perulangan melalui daftar putih untuk setiap properti di objek. Solusi di bawah ini jauh lebih cepat untuk kumpulan data besar karena hanya melewati peritel sekali:
sumber
Membonceng answeranswer ssube ini .
Ini versi yang bisa digunakan kembali.
Untuk menyebutnya gunakan
Hal yang indah tentang fungsi panah ES6 adalah Anda tidak harus masuk
allowed
sebagai parameter.sumber
Anda dapat melakukan sesuatu seperti ini:
Ini berfungsi tetapi tidak terlalu jelas, ditambah
with
pernyataan itu tidak direkomendasikan ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with ).sumber
Solusi yang lebih sederhana tanpa menggunakan
filter
dapat dicapai denganObject.entries()
alih - alihObject.keys()
sumber
Ada banyak cara untuk mencapai ini. The jawaban yang diterima menggunakan Keys-Filter-Mengurangi pendekatan, yang bukan yang paling performant.
Alih-alih, menggunakan
for...in
loop untuk mengulang melalui kunci dari suatu objek, atau mengulang melalui kunci yang dibolehkan, dan kemudian menyusun objek baru adalah ~ 50% lebih banyak performan a .Sebuah. Lihat jsPerf untuk tolok ukur kasus penggunaan sederhana. Hasil akan berbeda berdasarkan browser.
sumber
Anda dapat menghapus kunci spesifik pada objek Anda
sumber
sumber
Cara sederhana! Untuk melakukan ini.
sumber
Solusi lain menggunakan metode "baru"
Array.reduce
:Demonstrasi dalam Fiddle ini ...
Tapi saya suka solusi dalam jawaban ini di sini yang menggunakan dan :
Object.fromEntries
Array.filter
Array.includes
Demonstrasi dalam Fiddle ini ...
sumber
OK, bagaimana dengan ini:
dan menyebutnya seperti ini:
sumber
Fungsi ini akan memfilter objek berdasarkan daftar kunci, ini lebih efisien daripada jawaban sebelumnya karena tidak harus menggunakan Array.filter sebelum memanggil mengurangi. jadi itu O (n) sebagai lawan dari O (n + disaring)
sumber
Selama pengulangan, tidak mengembalikan apa pun ketika properti / kunci tertentu ditemukan dan melanjutkan sisanya:
sumber
Saya terkejut bagaimana belum ada yang menyarankan ini. Ini sangat bersih dan sangat eksplisit tentang kunci mana yang ingin Anda simpan.
Atau jika Anda ingin liner yang kotor:
sumber
Pendekatan lain akan digunakan
Array.prototype.forEach()
sebagaiIni mencakup nilai hanya kunci-kunci yang tersedia dalam data mentah dan dengan demikian mencegah penambahan data sampah.
sumber
Itu akan menjadi solusi saya:
sumber