Bagaimana cara memeriksa apakah angka berada di antara dua nilai?

144

Dalam JavaScript, saya memberi tahu browser untuk melakukan sesuatu jika ukuran jendela lebih besar dari 500px. Saya melakukannya seperti ini:

if (windowsize > 500) {
    // do this
}

Ini bekerja dengan baik, tetapi saya ingin menerapkan metode yang sama, tetapi dengan sejumlah angka. Jadi saya ingin memberi tahu browser saya untuk melakukan hal-hal jika ukuran jendela antara 500px dan 600px. Saya tahu ini tidak akan berhasil, tapi inilah yang saya bayangkan:

if (windowsize > 500-600) {
    // do this
}

Apakah ini mungkin, dalam JavaScript?

Dyck
sumber
9
Agak sulit untuk menutup pertanyaan ini. Dapatkah saya memilih untuk membukanya kembali. Itu ditulis dengan baik dan memberikan kode sampel.
Caltor
Tentunya pemeriksaan yang lebih tepat adalah apakah (windowsize> = 500 && windowsize <= 600) atau jika (! (Windowsize <500 || windowsize> 600))
SPlatten

Jawaban:

225

Menguji apakah windowsizelebih besar 500dan lebih kecil dari 600arti bahwa tidak ada nilai 500atau 600dirinya sendiri yang akan menghasilkan kondisi menjadi kenyataan.

if (windowsize > 500 && windowsize < 600) {
  // ...
}
tidak terdefinisi
sumber
1
terima kasih tidak terdefinisi, hanya untuk mengonfirmasi ini akan melakukan apa yang saya inginkan dalam browser ketika ukuran jendela lebih besar dari 500px dan kurang dari 600px, pada dasarnya hanya berfungsi dalam kisaran 500-600px saja, benar? (Saya tidak terlalu bagus dengan hal-hal ini lol)
Dyck
1
@ Dyck Ya, ya :), perhatikan bahwa jQuery hanya perpustakaan JavaScript.
undefined
7
Pikiran bahwa kondisi ini hanya benar ketika windowsizesetidaknya 501px dan paling banyak 599px. 500px dan 600px tidak termasuk. Tambahkan persamaan untuk perbandingan jika Anda ingin memasukkan nilai-nilai ini.
Robert Koritnik
3
Hanya detail, tetapi lebih mudah dibaca dengan cara berikut:if(500 < windowsize && windowsize < 600)
Giovanni Benussi
119

Saya punya waktu, jadi, meskipun Anda sudah menerima jawaban, saya pikir saya akan berkontribusi sebagai berikut:

Number.prototype.between = function(a, b) {
  var min = Math.min.apply(Math, [a, b]),
    max = Math.max.apply(Math, [a, b]);
  return this > min && this < max;
};

var windowSize = 550;

console.log(windowSize.between(500, 600));

Demo JS Fiddle .

Atau, jika Anda lebih suka memiliki opsi untuk memeriksa nomor dalam kisaran yang ditentukan termasuk titik akhir :

Number.prototype.between = function(a, b, inclusive) {
  var min = Math.min.apply(Math, [a, b]),
    max = Math.max.apply(Math, [a, b]);
  return inclusive ? this >= min && this <= max : this > min && this < max;
};

var windowSize = 500;

console.log(windowSize.between(500, 603, true));

Demo JS Fiddle .

Diedit untuk menambahkan amandemen kecil ke atas, mengingat bahwa - sebagaimana tercantum dalam komentar -

... Function.prototype.apply()lambat! Selain menyebutnya ketika Anda memiliki jumlah argumen tetap tidak ada gunanya ...

itu layak menghapus penggunaan Function.prototype.apply(), yang menghasilkan versi yang diubah dari metode di atas, pertama tanpa opsi 'inklusif':

Number.prototype.between = function(a, b) {
  var min = Math.min(a, b),
    max = Math.max(a, b);

  return this > min && this < max;
};

var windowSize = 550;

console.log(windowSize.between(500, 600));

Demo JS Fiddle .

Dan dengan opsi 'inklusif':

Number.prototype.between = function(a, b, inclusive) {
  var min = Math.min(a, b),
    max = Math.max(a, b);

  return inclusive ? this >= min && this <= max : this > min && this < max;
}

var windowSize = 500;

console.log(windowSize.between(500, 603, true));

Demo JS Fiddle .

Referensi:

David mengatakan mengembalikan Monica
sumber
6
mengapa menggunakan berlaku daripada menelepon langsung suka Main.min(a,b)? Function.prototype.apply lambat! Selain itu menyebutnya ketika Anda memiliki jumlah argumen tetap tidak ada gunanya.
Steel Brain
Saya akan menambahkan ini ke kotak alat default saya - sangat berguna dan terima kasih atas kontribusi ini!
SidOfc
@SteelBrain: Anda ada benarnya! Saya telah memperbarui jawaban untuk mencerminkan hal itu, meskipun saya curiga bahwa saya - pada awalnya - memiliki alasan untuk menggunakan Function.prototype.apply(), tetapi saya tidak dapat memikirkan apa itu, atau mungkin sudah.
David mengatakan mengembalikan Monica
6
jauh lebih baik untuk membuat fungsi yang tidak mengubah Numberobjek. Ini adalah anti-pola dan akan datang dan menggigit Anda jika standar ECMA berubah untuk memasukkan Number.between()fungsi, atau jika pustaka lain atau bagian kode Number.prototype.betweenlain mendefinisikan di tempat lain dengan definisi yang berbeda. Sebaliknya, buatlah fungsi pembantu dan gunakan itu!
Monarch Wadia
2
@MonarchWadia Sementara poin Anda masuk akal bahwa memodifikasi / memperluas objek asli adalah praktik yang buruk, saya merasa agak berlebihan memiliki khotbah ini di mana-mana (jangan tersinggung). Saya tidak dapat menghitung waktu yang saya lihat "jangan memodifikasi objek asli". Bagi saya, ini seperti seseorang yang menjual pisau rumah tangga memperingatkan pembeli tentang kemungkinan bahaya pisau setiap kali dia menjual pisau seperti itu tanggung jawab penjual jika ada kerusakan. Bahaya harus menjadi pengetahuan umum. Itu harus terserah pengguna jika dia mengabaikannya atau tidak.
akinuri
80

Saya lebih suka meletakkan variabel di bagian dalam untuk memberikan petunjuk tambahan bahwa kode memvalidasi variabel saya antara nilai rentang

if (500 < size && size < 600) { doStuff(); }
David
sumber
13
saya suka gaya ini! akan menyesuaikan itu :)
Kaii
2
Ini adalah pilihan saya, karena ini lebih dekat dengan min < testval < maxsintaks python
daveruinseverything
@GouravChawla, apakah Anda berbicara tentang contoh cuplikan kode dalam jawaban ini? Cuplikan kode saya adalah Python, digunakan untuk perbandingan
daveruinseverything
@GouravChawla tidak ada yang mengatakan sebaliknya. Tidak jelas apa yang tidak Anda setujui.
daveruinseverything
28

Ini pertanyaan lama, namun mungkin bermanfaat bagi orang seperti saya.

lodashmemiliki _.inRange()fungsi https://lodash.com/docs/4.17.4#inRange

Contoh:

_.inRange(3, 2, 4);
// => true

Harap dicatat bahwa metode ini menggunakan Lodashperpustakaan utilitas, dan memerlukan akses ke versi Lodash yang diinstal.

antongorodezkiy
sumber
2
Perlu diketahui bahwa nilai akhir tidak termasuk. misalnya. _.inRange(10, 0, 10) // => false
Lucio
Karena OP membatasi ruang lingkup pertanyaan Javascript, perlu dicatat bahwa metode ini menggunakan Lodashpustaka utilitas, dan membutuhkan akses ke versi Lodash yang diinstal.
Chaya Cooper
2

Anda dapat menggunakan beberapa klausa dalam ifkondisi alih-alih menulis

if (windowsize > 500-600) {
    // do this
}

karena ini benar-benar tidak masuk akal JavaScript akan membaca kondisi if Anda suka

windowSize > -100 

karena menghitung 500-600untuk-100

Anda harus menggunakan &&untuk memeriksa kedua kasus secara ketat misalnya yang akan terlihat seperti ini

if( windowSize > 500 && windowSize < 600 ){

// Then doo something

}
Hanzla Habib
sumber
0

Saya baru saja mengimplementasikan sedikit jQuery ini untuk menunjukkan dan menyembunyikan nilai-nilai modal bootstrap. Bidang yang berbeda ditampilkan berdasarkan rentang nilai entri kotak teks pengguna.

$(document).ready(function () {
    jQuery.noConflict();
    var Ammount = document.getElementById('Ammount');

    $("#addtocart").click(function () {

            if ($(Ammount).val() >= 250 && $(Ammount).val() <= 499) {
                {
                    $('#myModal').modal();
                    $("#myModalLabelbronze").show();
                    $("#myModalLabelsilver").hide();
                    $("#myModalLabelgold").hide();
                    $("#myModalPbronze").show();
                    $("#myModalPSilver").hide();
                    $("#myModalPGold").hide();
                }
            }
    });
Pria bijak
sumber
6
Menggunakan jQuery untuk fungsi-fungsi sepele adalah pada tahun 2013 mungkin merupakan pilihan tetapi tidak hari ini
mgamsjager
3
Benar tapi saya khawatir orang masih akan menggunakannya hari ini
mgamsjager
1
Karena penasaran: mengapa jQuery lebih buruk digunakan untuk fungsi-fungsi sepele daripada saat itu?
Julix
2
@Julix sebagian besar kinerja, meskipun dapat diabaikan dalam hal ini. Poin umumnya adalah "jangan gunakan jQuery ketika itu tidak perlu" tetapi komentar ini bukanlah tempat untuk memulai kembali perdebatan. bersenang-senanglah dengan ini :) i.stack.imgur.com/sGhaO.gif
Luca
Ini hanyalah implementasi dari solusi. OP sudah memiliki akses ke nilai. Jadi jQuery $().val()tidak relevan dan tidak perlu. Tetapi sekali lagi, dalam versi asli pertanyaan, OP menyebutkan jQuery, untuk pemeriksaan aritmatika sederhana. (Menghela napas) Itu kesalahan pertama.
akinuri
0

Berikut adalah metode sesingkat mungkin:

if (Math.abs(v-550)<50) console.log('short')
if ((v-500)*(v-600)<0) console.log('short')

Parametrized:

if (Math.abs(v-max+v-min)<max+min) console.log('short')
if ((v-min)*(v-max)<0) console.log('short')

Anda dapat membagi kedua sisi dengan 2 jika Anda tidak mengerti bagaimana yang pertama bekerja;)

yukashima huksay
sumber