Saya selalu menemukan range
fungsi yang hilang dari JavaScript karena tersedia di python dan lainnya? Apakah ada cara ringkas untuk menghasilkan rentang angka di ES2015?
EDIT: Pertanyaan SAYA berbeda dari duplikat yang disebutkan karena khusus untuk ES2015 dan bukan ECMASCRIPT-5. Saya juga membutuhkan kisaran untuk mulai dari 0 dan bukan nomor awal yang spesifik (meskipun akan lebih baik jika itu ada)
javascript
arrays
ecmascript-6
Aditya Singh
sumber
sumber
[...Array(n).keys()]
.[...Array(5)].map((_,i) => i+1)
Jawaban:
Anda dapat menggunakan operator sebaran pada kunci dari array yang baru dibuat.
[...Array(n).keys()]
atau
Array.from(Array(n).keys())
The
Array.from()
sintaks diperlukan jika bekerja dengan naskahsumber
function range (start, end) { return [...Array(1+end-start).keys()].map(v => start+v) }
Array.from(Array(n).keys())
.[...Array(n).keys()]
tidak bekerja di Ketikan? Apakah ini penyimpangan yang disengaja dari implementasi JS lainnya?Array(5).keys().slice()
dan slice bukan metode iterator array. Berikut adalah contoh tidak berfungsi typescriptlang.org/play/…Saya juga menemukan satu cara yang lebih intuitif menggunakan
Array.from
:Sekarang
range
fungsi ini akan mengembalikan semua angka mulai dari 0 hingga n-1Versi rentang yang dimodifikasi untuk mendukung
start
danend
adalah:EDIT Seperti yang disarankan oleh @ marco6, Anda dapat meletakkan ini sebagai metode statis jika sesuai dengan kasus penggunaan Anda
dan gunakan sebagai
sumber
interface ArrayConstructor { range(n: number): number[]; }
Array.range = n => Array.from({length: n}, (value, key) => key);
Dan kemudian di mana-manaArray.range(x)...
[ts] Property 'range' does not exist on type 'ArrayConstructor'
. thouths?Dengan Delta
Untuk javascript
Untuk Ketikan
Memperbarui
Sunting
sumber
Array.from(Array(~~((to - from) / step) + 1).keys())
Untuk angka 0 sampai 5
sumber
Banyak dari solusi ini dibuat berdasarkan contoh objek Array nyata, yang dapat menyelesaikan pekerjaan untuk banyak kasus tetapi tidak dapat mendukung kasus seperti
range(Infinity)
. Anda dapat menggunakan generator sederhana untuk menghindari masalah ini dan mendukung urutan tak terbatas:Contoh:
sumber
Jadi, dalam hal ini, alangkah baiknya jika Number objek akan berperilaku seperti objek Array dengan operator spread.
Misalnya objek Array yang digunakan dengan operator spread:
Ia bekerja seperti ini karena objek Array memiliki iterator bawaan.
Dalam kasus kami, kami memerlukan objek Angka untuk memiliki fungsi serupa:
Untuk melakukan itu kita cukup membuat iterator Angka untuk tujuan itu.
Sekarang dimungkinkan untuk membuat rentang dari 0 hingga N dengan operator penyebaran.
http://jsfiddle.net/01e4xdv5/4/
Bersulang.
sumber
Anda bisa menggunakan fungsi generator, yang membuat rentang dengan malas hanya jika diperlukan:
Anda dapat menggunakan fungsi generator tingkat tinggi untuk memetakan
range
generator:Jika Anda tidak takut, Anda bahkan dapat menggeneralisasi pendekatan generator untuk menangani rentang yang lebih luas (permainan kata-kata):
Perlu diingat bahwa generator / iterator secara inheren bersifat stateful, yaitu, ada perubahan status implisit dengan setiap pemanggilan
next
. Negara adalah berkah campuran.sumber
Rentang dengan langkah ES6, yang berfungsi mirip dengan python
list(range(start, stop[, step]))
:Contoh:
sumber
Untuk mendukung delta
sumber
Anda juga dapat melakukannya dengan satu liner dengan dukungan langkah seperti ini:
((from, to, step) => ((add, arr, v) => add(arr, v, add))((arr, v, add) => v < to ? add(arr.concat([v]), v + step, add) : arr, [], from))(0, 10, 1)
Hasilnya adalah
[0, 1, 2, 3, 4, 5, 6 ,7 ,8 ,9]
.sumber
Fungsi ini akan mengembalikan urutan integer.
sumber
di Ketikan
sumber
Array.from
dan menyebarkan sintaks. Dan kemudian sama persis dengan jawaban yang ada.[...Array(n).keys()]
tidak berfungsi di Ketikan.Array.from(Array(n).keys())
. Saya cukup yakin itu harus bekerja, apa yang literal dengan sintaks menyebar transparan ke?Berikut variasi lain yang tidak digunakan
Array
.sumber
Generator sekarang memungkinkan Anda untuk membuat urutan angka dengan malas dan menggunakan lebih sedikit memori untuk rentang yang besar.
Sementara pertanyaannya secara khusus menyatakan ES2015, saya berharap banyak pengguna Typecript akan berakhir di sini dan konversi ke ES mudah ...
Dua deklarasi fungsi pertama hanya untuk memberikan saran penyelesaian yang lebih informatif di IDE Anda.
sumber
Bagaimana kalau hanya memetakan ....
Array (n) .map ((value, index) ....) sudah 80% jalan ke sana. Tetapi untuk beberapa alasan aneh itu tidak berhasil. Tapi ada solusinya.
Untuk rentang
Aneh, kedua iterator ini mengembalikan hasil yang sama:
Array(end-start+1).entries()
danArray(end-start+1).fill().entries()
sumber