Bir sayının iki değer arasında olup olmadığını nasıl kontrol edebilirim?


144

JavaScript'te, pencere boyutu 500 pikselden büyükse tarayıcıya bir şeyler yapmasını söylüyorum. Bunu şöyle yaparım:

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

Bu harika çalışıyor, ancak aynı yöntemi uygulamak istiyorum, ancak bir dizi sayı ile. Bu yüzden, pencere boyutu 500 piksel ile 600 piksel arasındaysa tarayıcıma bir şeyler yapmasını söylemek istiyorum. Bunun işe yaramayacağını biliyorum, ama işte böyle hayal ettim:

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

JavaScript içinde bu mümkün mü?


9
Bu soruyu kapatmak biraz zor görünüyor. Tekrar açmak için oy kullanabilir miyim? İyi yazılmıştır ve örnek kod verir.
Hesap Makinesi

Şüphesiz daha doğru bir kontrol (windowsize> = 500 && windowsize <= 600) veya (! (
Windowsize

Yanıtlar:


225

Olmadığını test windowsizedaha büyüktür 500daha ve daha az 600ne değerler anlamına 500veya 600kendisi gerçek olma koşulu ile sonuçlanacaktır.

if (windowsize > 500 && windowsize < 600) {
  // ...
}

1
teşekkürler undefined, sadece pencere boyutu 500 pikselden daha büyük ve 600 pikselden az olduğunda, tarayıcıda istediğim şeyi yapacağını doğrulamak için, sadece 500-600 piksel aralığında çalışıyor, doğru mu? (Bu şeylerle çok iyi değilim)
Dyck

1
@Dyck Evet, öyle :), jQuery'nin yalnızca bir JavaScript kütüphanesi olduğunu unutmayın.
undefined

7
Bu koşulun yalnızca windowsizeen az 501 piksel ve en fazla 599 piksel olduğunda geçerli olduğunu unutmayın. 500 piksel ve 600 piksel hariç tutulur. Bu değerleri dahil etmek istiyorsanız karşılaştırmalara eşitlik ekleyin.
Robert Koritnik

3
Sadece bir detay, ama aşağıdaki şekilde daha okunabilir:if(500 < windowsize && windowsize < 600)
Giovanni Benussi

119

Bir anım vardı, bu yüzden, bir cevabı zaten kabul etmenize rağmen, aşağıdakilere katkıda bulunacağımı düşündüm:

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));

JS Fiddle demosu .

Veya, bir sayıyı bitiş noktaları dahil olmak üzere tanımlanmış aralıkta olup olmadığını kontrol etme seçeneğiniz varsa :

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));

JS Fiddle demosu .

Yukarıda belirtildiği gibi - yorumlarda belirtildiği gibi - küçük bir değişiklik eklemek için düzenlendi

Function.prototype.apply()Yavaş! Sabit miktarda argümanınız olduğunda bunu çağırmanın yanı sıra anlamsız…

Function.prototype.apply()öncelikle 'kapsayıcı' seçenek olmadan yukarıdaki yöntemlerin değiştirilmiş sürümlerini veren kullanımını kaldırmaya değdi :

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));

JS Fiddle demosu .

Ve 'kapsayıcı' seçeneği ile:

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));

JS Fiddle demosu .

Referanslar:


6
neden doğrudan çağrı yapmak yerine uygula Main.min(a,b)? Fonksiyon.prototip.Uygulama yavaş! Ayrıca, sabit miktarda argümanınız olduğunda bunu çağırmak anlamsızdır.
Çelik Beyin

Bunu varsayılan araç kutuma ekleyeceğim - çok kullanışlı ve bu katkı için teşekkürler!
SidOfc

@SteelBrain: bir noktanız var! Başlangıçta - - Elimde şüpheli olsa, o yansıtacak şekilde cevap güncelledik bir sebep kullanmak için Function.prototype.apply(), ama, ya olmuş olabileceğini düşünemiyorum.
David, Monica

6
Numbernesneyi değiştirmeyen bir işlev oluşturmak çok daha iyidir . Bu bir anti-modeldir ve ECMA standartları bir Number.between()işlevi içerecek şekilde değişirse veya başka bir kütüphane veya başka bir kod parçası Number.prototype.betweenbaşka bir tanımın farklı bir tanımla tanımlanması durumunda size gelip ısırır . Bunun yerine, bir yardımcı işlev yapın ve bunu kullanın!
Monarch Wadia

2
@MonarchWadia Amacınız, yerel nesneleri değiştirmenin / genişletmenin kötü bir uygulama olduğu anlamına gelse de, bunun her yerde vaaz edilmesinin biraz gereksiz olduğunu düşünüyorum (suç yok). "Yerel nesneleri değiştirme" zamanlarını sayamıyorum. Benim için bu, ev bıçakları satan biri gibi, her seferinde bıçağın olası tehlikeleri hakkında alıcıyı uyardığı gibi, herhangi bir zarar varsa satıcının sorumluluğu gibi satıyor. Tehlikeler ortak bilgi olmalıdır. Göz ardı edip etmemesi kullanıcıya bağlı olmalıdır.
akinuri

80

Kod değişkenimi aralık değerleri arasında olduğunu doğrulayan ekstra bir ipucu vermek için iç değişken koymak tercih

if (500 < size && size < 600) { doStuff(); }

13
bu tarzı sevdim! adapte edecek :)
Kaii

2
Bu benim tercihim, çünkü min < testval < max
python'un

@ GouravChawla Bu cevaptaki kod pasajı örneğinden bahsediyor musunuz? Kod snippet'im karşılaştırma için kullanılan Python'du
daveruinseverything

@ GouravChawla kimse aksini söylemedi. Neye katılmamanız gerektiği belli değil.
daveruinseverything

28

Bu eski bir soru, ancak benim gibi biri için yararlı olabilir.

lodashvardır _.inRange()işlevi https://lodash.com/docs/4.17.4#inRange

Misal:

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

Lütfen bu yöntemin Lodashyardımcı program kitaplığını kullandığını ve yüklü bir Lodash sürümüne erişim gerektirdiğini unutmayın.


2
Lütfen son değerin dahil olmadığını unutmayın. Örneğin. _.inRange(10, 0, 10) // => false
Lucio

OP, soru kapsamını sınırladığı için Javascript, bu yöntemin Lodashyardımcı program kitaplığını kullandığını ve yüklü bir Lodash sürümüne erişim gerektirdiğini belirtmek gerekir.
Chaya Cooper

2

Birden çok yan tümcesi ifyazmak yerine koşul olarak kullanabilirsiniz

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

çünkü bu mantıklı bir şekilde mantıklı değil.

windowSize > -100 

Bu hesaplar için 500-600için-100

Her &&iki durumu da sıkı bir şekilde kontrol etmek için kullanmalısınız .

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

// Then doo something

}

0

Ben sadece bu jQuery bit bootstrap kalıcı değerleri göstermek ve gizlemek için uyguladı. Bir kullanıcı metin kutusu girişinin değer aralığına bağlı olarak farklı alanlar görüntülenir.

$(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();
                }
            }
    });

6
Önemsiz işlevler için jQuery kullanmak 2013 yılında belki bir seçenek oldu ama bugün değil
mgamsjager

3
Doğru ama korkarım insanlar hala bugün kullanacak
mgamsjager

1
Merak etme: jQuery neden şimdi önemsiz işlevler için o zamandan daha kötü?
Julix

2
@ Julix çoğunlukla performans, bu durumda ihmal edilebilir olsa da. Genel nokta "gerekli olmadığında jQuery kullanma" olacaktır ama bu yorumlar tartışmayı (yeniden) başlatmak için bir yer değildir. Bununla birlikte iyi eğlenceler :) i.stack.imgur.com/sGhaO.gif
Luca

Bu sadece çözümün bir uygulamasıdır. OP zaten değerlere erişebilir. Bu nedenle jQuery $().val()önemsizdir ve gerekli değildir. Ama yine, sorunun orijinal versiyonunda OP basit bir aritmetik kontrol için jQuery'den bahseder. (iç çeker) Bu ilk hata.
akinuri

0

İşte mümkün olan en kısa yöntem:

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

parametrize:

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

İlkinin nasıl çalıştığını anlamıyorsanız, her iki tarafı da 2'ye bölebilirsiniz;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.