tanggal dan nomor parse dari hasil API
Saya menyeruput bidang dari API yang mengembalikan larik bidang. Setiap bidang dalam larik adalah String yang sebenarnya berisi dua bidang terpisah (angka dan tanggal). Nomornya diapit tanda kurung dan tanggalnya mengikuti ini dan spasi. Berikut ini adalah contoh formatnya.
const data = [
"(2) 2020-09-15", "(3) 2020-09-16"
];
Saya mengurai bidang ini dan kemudian menyimpan data secara terpisah di aplikasi saya. Saya memiliki bidang angka dan tanggal saya sendiri yang akan menjadi String di mana setiap angka dan tanggal dipisahkan oleh baris baru.
Saya mencapai ini dengan melakukan hal berikut.
let numbers = '', dates = numbers;
for (let datum of data) {
datum = datum.split(/[() ]/);
numbers += `${datum[1]}\n`; dates += `${datum[3]}\n`;
}
Lihat contohnya di sini .
Saya tidak terlalu suka ini dan bertanya-tanya apakah ada cara yang lebih efisien dan lebih bersih untuk menulis ini.
Jawaban
Daripada mendeklarasikan variabel dengan let(Anda harus selalu memilihconst ) dan menggabungkan serta menetapkan ulang, pertimbangkan untuk membuat array angka dan tanggal, misalnya:
[2, 3] dan ["2020-09-15", "2020-09-16"]
Kemudian setelah loop selesai, gabungkan semua elemen dengan baris baru.
Untuk ekspresi reguler, daripada split, saya pikir matchakan lebih tepat. Anda dapat menggunakan \((\d+)\) (\S+):
\(- literal((\d+)- Grup penangkap pertama, terdiri dari digit\)- literal)- ruang literal(\S+)- Grup penangkap ke-2, terdiri dari non-spasi
Kemudian ekstrak grup penangkap pertama dan kedua.
const data = [
"(2) 2020-09-15", "(3) 2020-09-16"
];
const numbers = [];
const dates = [];
for (const item of data) {
const [, number, date] = item.match(/\((\d+)\) (\S+)/);
numbers.push(number);
dates.push(date);
}
console.log(numbers.join('\n'));
console.log(dates.join('\n'));
Kasus tepi
Di dunia nyata, masukan tidak selalu terbentuk dengan baik. Apa yang terjadi jika ada kesalahan ketik pada data? Sebagai contoh:
const data = [
"(2) 2020-09-15", "(3] 2020-09-16"
];
Ini akan menyebabkan undefinedmuncul di keluaran untuk tanggal. Dalam kasus / kerangka kerja / bahasa lain, pengecualian mungkin dilemparkan yang dapat merusak skrip / program Anda. Akan lebih baik untuk waspada terhadap skenario seperti itu dengan melakukan kesalahan atau setidaknya melewatkan penambahan data tersebut.
Variabel clobbering
Dalam pengaturan loop, datumdiberikan setiap string dalam data:
for (let datum of data) {
Baris ini menimpa variabel itu dengan array:
datum = datum.split(/[() ]/);
Ini legal dalam JavaScript karena diketik secara longgar. Tetapi pikirkan siapa pun yang membaca kode ini (termasuk diri Anda di masa depan!) Saat memodifikasi kode ini. Bagaimana jika nanti Anda memutuskan untuk menggunakan datumuntuk menampilkan output secara berbeda - Anda perlu menentukan apakah itu adalah datumstring atau datumitu adalah array. Nama variabel yang terpisah mungkin menyebabkan lebih sedikit kebingungan dalam hal itu, dan juga memberikan petunjuk yang lebih baik tentang apa yang ada di dalam array - misalnya parts, atau seperti yang disarankan oleh jawaban SurePerformance, menggunakan tugas penghancuran dapat membantu menghindari skenario itu sama sekali.
Saya akan menggunakan sesuatu seperti ini:
const data = [
"(2) 2020-09-15", "(3) 2020-09-16"
];
let pairs = [];
const regex = /^\((\d+)\)\s+(\d{4}-\d{2}-\d{2})$/;
for (let datum of data) {
// Idea from the previous answer:
let pair = {};
[, pair.number, pair.date] = regex.exec(datum);
pairs.push (pair);
}
console.log(pairs);
[, pair.number, pair.date]membuang seluruh pertandingan, yang tidak diperlukan.
Berbeda dengan solusi yang diajukan oleh penulis soal, tanggal dan bilangan terkait disatukan dalam satu objek. Selain itu, pemisahan tidak digunakan, karena bergantung pada detail format teks yang dapat diubah nanti dan secara semantik lebih cocok untuk mengekstrak fragmen serupa dalam jumlah tak terbatas dari teks.