Di PHP, Anda bisa melakukan ...
range(1, 3); // Array(1, 2, 3)
range("A", "C"); // Array("A", "B", "C")
Artinya, ada fungsi yang memungkinkan Anda mendapatkan rentang angka atau karakter dengan melewati batas atas dan bawah.
Apakah ada bawaan untuk JavaScript untuk ini? Jika tidak, bagaimana saya menerapkannya?
$R
fungsi, tetapi selain itu saya tidak berpikir begitu.Array.from("ABC") //['A', 'B', 'C']
Ini adalah hal terdekat yang dapat saya temukan untuk bagian kedua dari pertanyaan.split("")
sana jugaArray.apply(null, { length: 10 }).map(eval.call, Number)
Jawaban:
Angka
Iterasi karakter
Pengulangan
Sebagai fungsi
Seperti fungsi yang diketik
_.range()
fungsi lodash.jsPeramban non es6 lama tanpa perpustakaan:
(Kredit ES6 untuk nils petersohn dan komentator lainnya)
sumber
(new Array(5)).map(function (value, index) { return index; })
tidak akan berhasil? Ini kembali[undefined × 5]
untuk saya di Chrome DevTools.map()
atau salah satu temannya.Array(5).fill()
juga dapat dipetakanUntuk angka, Anda dapat menggunakan ES6
Array.from()
, yang berfungsi dalam segala hal saat ini kecuali IE:Versi lebih pendek:
Versi yang lebih panjang:
yang menciptakan array dari 0 hingga 19 inklusif. Ini dapat disingkat menjadi salah satu dari bentuk-bentuk ini:
Batas bawah dan atas dapat ditentukan juga, misalnya:
Artikel yang menjelaskan hal ini secara lebih rinci: http://www.2ality.com/2014/05/es6-array-methods.html
sumber
Array.from()
metodenya, dan lebih cepat dari keduanya:Array(20).fill().map((_, i) => i)
Array.from({length: end - start}, (v, k) => k + start)
undefined
, jadifill()
(tanpa argumen) tidak salah per se. Nilai isian tidak digunakan dalam solusi itu, jadi jika Anda suka, Anda bisa menggunakanfill(0)
untuk menyimpan beberapa karakter.Formulir favorit baru saya ( ES2015 )
Dan jika Anda membutuhkan fungsi dengan
step
param:sumber
stop
sebenarnya bukan posisi berhenti / ujung tetapi menghitung / jarak. (jangan tersinggung, hanya untuk membuat orang sadar akan kesalahan ketik)Array(Math.ceil((stop - start) / step) + 1)
, perlu+1
di bagian akhir, untuk benar-benar meniru perilaku "inklusif" php.range
metode. Semua yang lain saat ini di atas ini (kecuali untuk lodash's_.range
) menerapkan iterator dasar daripada fungsi rentang yang sebenarnya dengan start, stop dan stepInilah 2 sen saya:
sumber
Ini berfungsi untuk karakter dan angka, maju atau mundur dengan langkah opsional.
jsFiddle .
Jika menambah tipe asli adalah hal Anda, maka tetapkan untuk itu
Array.range
.Tampilkan cuplikan kode
sumber
Fungsi rentang sederhana:
Untuk memasukkan tipe data BitInt beberapa pemeriksaan dapat dimasukkan, memastikan bahwa semua variabel sama
typeof start
:Untuk menghapus nilai yang lebih tinggi dari yang didefinisikan oleh
stop
misalnyarange(0,5,2)
akan termasuk6
, yang seharusnya tidak.sumber
step != 1
,while
kondisi perlustep
diperhitungkan. Versi saya yang diperbarui denganstep
nilai default : rentang fungsi (mulai, berhenti, langkah) {step = step || 1 var a = [mulai], b = mulai; while ((b + step) <stop) {console.log ("b:" + b + ". a:" + a + "."); b + = langkah; a.push (b); } mengembalikan a; }(step || 1)
,.sumber
Array
prototipe.undefined method toUpperCase to etc
!OK, di JavaScript kami tidak memiliki
range()
fungsi seperti PHP , jadi kami perlu membuat fungsi yang cukup mudah, saya menulis beberapa fungsi satu-baris untuk Anda dan memisahkannya untuk Bilangan dan Abjad seperti di bawah ini:untuk Angka :
dan menyebutnya seperti:
untuk Abjad :
dan menyebutnya seperti:
sumber
Array(end - start + 1)
, danArray(end.charCodeAt(0) - start.charCodeAt(0) + 1)
.Berguna untuk melakukan triknya, jalankan snipet kode di bawah ini
di sini adalah bagaimana menggunakannya
range (Mulai, Akhir, Langkah = 1, Offset = 0);
range(5,10) // [5, 6, 7, 8, 9, 10]
range(10,5) // [10, 9, 8, 7, 6, 5]
range(10,2,2) // [10, 8, 6, 4, 2]
range(5,10,0,-1) // [6, 7, 8, 9] not 5,10 themselves
range(5,10,0,1) // [4, 5, 6, 7, 8, 9, 10, 11]
range(5,10,0,-2) // [7, 8]
range(10,0,2,2) // [12, 10, 8, 6, 4, 2, 0, -2]
semoga bermanfaat.
Dan inilah cara kerjanya.
Pada dasarnya saya pertama-tama menghitung panjang array yang dihasilkan dan membuat nol array diisi untuk panjang itu, kemudian mengisinya dengan nilai-nilai yang dibutuhkan
(step || 1)
=> Dan yang lain seperti ini berarti menggunakan nilaistep
dan jika tidak disediakan gunakan1
sebagai gantinya(Math.abs(end - start) + ((offset || 0) * 2)) / (step || 1) + 1)
untuk membuatnya lebih sederhana (perbedaan * offset di kedua arah / langkah)new Array(length).fill(0);
cek di sini[0,0,0,..]
dengan panjang yang kita inginkan. Kami memetakannya dan mengembalikan array baru dengan nilai yang kami butuhkanArray.map(function() {})
var direction = start < end ? 1 : 0;
Tentunya jikastart
tidak lebih kecil dari yangend
kita butuhkan untuk mundur. Maksud saya pergi dari 0 ke 5 atau sebaliknyastartingPoint
+stepSize
*index
akan memberi kita nilai yang kita butuhkansumber
sumber
_
itu hanya nama argumen dalam pemetaan panggilan balik. Anda tahu, dalam beberapa bahasa Anda akan menggunakan_
sebagai nama untuk menunjukkan bahwa variabel tidak digunakan._
sini tidak diteruskan argumen kerange
. Kenapa tidak?Menggunakan fungsi Harmony spread operator dan panah:
Contoh:
sumber
--- PEMBARUAN (Terima kasih kepada @lokhmakov untuk penyederhanaan) ---
Versi lain menggunakan generator ES6 (lihat jawaban Paolo Moretti dengan generator ES6 ):
Atau, jika hanya perlu diubah, maka:
--- kode ORGINAL adalah: ---
dan
sumber
const range = (x, y) => Array.from(function* () { while (x <= y) yield x++; }())
Melakukan penelitian pada beberapa Fungsi Range. Lihat perbandingan jsperf tentang berbagai cara untuk melakukan fungsi-fungsi ini. Tentu saja bukan daftar yang sempurna atau lengkap, tetapi harus membantu :)
Pemenangnya adalah...
Secara teknis itu bukan yang tercepat di firefox, tetapi perbedaan kecepatan gila (imho) pada chrome membuatnya untuk itu.
Pengamatan yang menarik adalah seberapa cepat chrome menggunakan fungsi array ini daripada firefox Chrome setidaknya 4 atau 5 kali lebih cepat .
sumber
Javascript standar tidak memiliki fungsi bawaan untuk menghasilkan rentang. Beberapa kerangka kerja javascript menambahkan dukungan untuk fitur-fitur seperti itu, atau seperti yang orang lain tunjukkan, Anda selalu dapat menjalankannya sendiri.
Jika Anda ingin memeriksa ulang, sumber daya definitif adalah ECMA-262 Standard .
sumber
Anda dapat menggunakan lodash atau Undescore.js
range
:Sebagai alternatif, jika Anda hanya perlu berbagai bilangan bulat berturut-turut, Anda dapat melakukan sesuatu seperti:
Dalam ES6
range
dapat diimplementasikan dengan generator :Implementasi ini menghemat memori saat mengulang urutan besar, karena tidak harus mematerialisasikan semua nilai ke dalam array:
sumber
Array.from
untuk mengonversi generator ke array instance dan memeriksa output.Tantangan yang menarik adalah menulis fungsi terpendek untuk melakukan ini. Rekursi untuk menyelamatkan!
Cenderung lambat pada rentang yang luas, tetapi untungnya komputer kuantum sudah dekat.
Bonus tambahan adalah bahwa itu membingungkan. Karena kita semua tahu betapa pentingnya menyembunyikan kode kita dari mencongkel mata.
Untuk benar-benar dan sama sekali mengaburkan fungsi, lakukan ini:
sumber
const range = (a, b) => (a>=b) ? [] : [a, ...range(a+1, b)]
:, menggunakan sintaksconst range = (a, b, Δ = 1) => (a > b) ? [] : [a, ...range(a + Δ, b, Δ)];
. Juga mengangkat seluruh jawaban untuk komentar.Ini mungkin bukan cara terbaik. Tetapi jika Anda mencari untuk mendapatkan kisaran angka dalam satu baris kode. Misalnya 10 - 50
Di mana 40 adalah (akhir - awal) dan 10 adalah awal. Ini seharusnya mengembalikan [10, 11, ..., 50]
sumber
Saya akan kode sesuatu seperti ini:
Berperilaku mirip dengan rentang Python:
sumber
Implementasi yang agak minimalis yang banyak mempekerjakan ES6 dapat dibuat sebagai berikut, menarik perhatian khusus pada
Array.from()
metode statis:sumber
getRange()
fungsi "ditingkatkan" . Secara khusus, saya bertujuan untuk menangkap kasus tepi yang mungkin tidak tertangani dalam varian telanjang-tulang di atas. Selain itu, saya menambahkan dukungan untuk rentang alfanumerik. Dengan kata lain, menyebutnya dengan dua input yang disediakan seperti'C'
dan'K'
(dalam urutan itu) mengembalikan array yang nilainya adalah serangkaian karakter berurutan dari huruf 'C' (inklusif) melalui huruf 'K' (eksklusif):getRange('C', 'K'); // => ["C", "D", "E", "F", "G", "H", "I", "J"]
new
kata kuncirange(start,end,step)
: Dengan ES6 IteratorsAnda hanya meminta batas atas dan bawah. Di sini kita membuat satu dengan langkah juga.
Anda dapat dengan mudah membuat
range()
fungsi generator yang dapat berfungsi sebagai iterator. Ini berarti Anda tidak perlu membuat-pre seluruh array.Sekarang Anda mungkin ingin membuat sesuatu yang pra-menghasilkan array dari iterator dan mengembalikan daftar. Ini berguna untuk fungsi yang menerima array. Untuk ini bisa kita gunakan
Array.from()
Sekarang Anda dapat membuat array statis dengan mudah,
Tetapi ketika sesuatu menginginkan iterator (atau memberi Anda pilihan untuk menggunakan iterator), Anda juga dapat membuatnya dengan mudah.
Catatan khusus
R.range
seperti halnya Lodashsumber
Meskipun ini bukan dari PHP , tetapi tiruan
range
dari Python .sumber
Sejauh menghasilkan array numerik untuk rentang tertentu, saya menggunakan ini:
Jelas, itu tidak akan berfungsi untuk array alfabet.
sumber
array = []
di dalam loop mungkin tidak memberikan apa yang Anda inginkan.[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
, saya akan berharap hanya setengah dari array itu.Menggunakan generator Harmony , didukung oleh semua browser kecuali IE11 :
Contohnya
mengambil
Contoh 1.
take
hanya membutuhkan sebanyak yang bisa didapattake(10, range( {from: 100, step: 5, to: 120} ) )
kembali
[100, 105, 110, 115, 120]
Contoh 2.
to
tidak perlutake(10, range( {from: 100, step: 5} ) )
kembali
[100, 105, 110, 115, 120, 125, 130, 135, 140, 145]
ambil semua
Contoh 3.
from
tidak perlutakeAll( range( {to: 5} ) )
kembali
[0, 1, 2, 3, 4, 5]
Contoh 4
takeAll( range( {to: 500, step: 100} ) )
kembali
[0, 100, 200, 300, 400, 500]
Contoh 5.
takeAll( range( {from: 'z', to: 'a'} ) )
kembali
["z", "y", "x", "w", "v", "u", "t", "s", "r", "q", "p", "o", "n", "m", "l", "k", "j", "i", "h", "g", "f", "e", "d", "c", "b", "a"]
sumber
for
klausa akan meningkatkan keterbacaan di sini.... jangkauan lebih jauh, menggunakan fungsi generator.
Semoga ini bermanfaat.
sumber
Rekan kerja codegolf saya membuat ini (ES6), termasuk:
tidak termasuk:
sumber
Anda dapat menggunakan
lodash
fungsi_.range(10)
https://lodash.com/docs#rangesumber
d3 juga memiliki fungsi rentang bawaan. Lihat https://github.com/mbostock/d3/wiki/Arrays#d3_range :
Contoh:
sumber
Selesaikan implementasi ES6 menggunakan tanda tangan range ([start,] stop [, step]):
Jika Anda ingin melangkah negatif secara otomatis, tambahkan
Atau lebih minimalis:
Jika Anda memiliki rentang besar, lihat pendekatan generator Paolo Moretti
sumber
!stop
dengantypeof stop === 'undefined'
, lalu gantiint
denganMath.floor
, dan tambahkan cekif (start > stop && step > 0)
(jika tidak,range(-3, -10)
lempar pengecualian daripada melakukan sesuatu yang waras (baik membalik tanda langkah atau kembali[]
)). Kalau tidak, bagus!Ada modul npm bereich untuk itu ("bereich" adalah kata Jerman untuk "range"). Itu menggunakan iterators JavaScript modern, sehingga Anda dapat menggunakannya dengan berbagai cara, seperti:
Ini juga mendukung rentang menurun (hanya dengan bertukar
min
danmax
), dan juga mendukung langkah selain1
.Penafian: Saya adalah pembuat modul ini, jadi tolong jawab jawaban saya dengan sebutir garam.
sumber
Yang ini bekerja juga secara terbalik.
sumber