Làm thế nào để kiểm tra nếu một số nằm giữa hai giá trị?


144

Trong JavaScript, tôi đang bảo trình duyệt làm gì đó nếu kích thước cửa sổ lớn hơn 500px. Tôi làm như vậy:

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

Điều này hoạt động rất tốt, nhưng tôi muốn áp dụng phương pháp tương tự, nhưng với một loạt các số. Vì vậy, tôi muốn nói với trình duyệt của mình làm công cụ nếu kích thước cửa sổ nằm trong khoảng từ 500px đến 600px. Tôi biết điều này sẽ không hoạt động, nhưng đây là cách tôi tưởng tượng nó:

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

Điều này thậm chí có thể, trong JavaScript?


9
Có vẻ hơi khắc nghiệt để đóng câu hỏi này. Tôi có thể bỏ phiếu để mở lại nó Nó được viết tốt và cung cấp mã mẫu.
Caltor

Chắc chắn kiểm tra chính xác hơn sẽ là nếu (windowsize> = 500 && windowsize <= 600) hoặc if (! (Windowize <500 ||
windowsize

Câu trả lời:


225

Kiểm tra xem windowsizelớn hơn 500và nhỏ hơn 600có nghĩa là không có giá trị 500hoặc 600chính nó sẽ dẫn đến điều kiện trở thành đúng.

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

1
cảm ơn không xác định, chỉ cần xác nhận điều này sẽ làm những gì tôi muốn trong trình duyệt khi kích thước cửa sổ lớn hơn 500px và dưới 600px, về cơ bản chỉ hoạt động trong phạm vi 500-600px, đúng không? (Tôi không quá giỏi với những thứ này lol)
Dyck

1
@Dyck Vâng, nó làm như vậy :), lưu ý rằng jQuery chỉ là một thư viện JavaScript.
không xác định

7
Lưu ý rằng điều kiện này chỉ đúng khi windowsizecó ít nhất 501px và tối đa là 599px. 500px và 600px được loại trừ. Thêm bình đẳng để so sánh nếu bạn muốn bao gồm các giá trị này.
Robert Koritnik

3
Chỉ là một chi tiết, nhưng dễ đọc hơn theo cách sau:if(500 < windowsize && windowsize < 600)
Giovanni Benussi

119

Tôi đã có một khoảnh khắc, vì vậy, mặc dù bạn đã chấp nhận câu trả lời, tôi nghĩ tôi sẽ đóng góp như sau:

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

Bản demo của Fiddle .

Hoặc, nếu bạn muốn có tùy chọn kiểm tra một số nằm trong phạm vi được xác định bao gồm các điểm cuối :

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

Bản demo của Fiddle .

Đã chỉnh sửa để thêm một sửa đổi nhỏ ở trên, cho rằng - như đã lưu ý trong các nhận xét -

Sầu Function.prototype.apply()thì chậm! Bên cạnh việc gọi nó khi bạn có một lượng đối số cố định là vô nghĩa

đáng để loại bỏ việc sử dụng Function.prototype.apply(), mang lại các phiên bản sửa đổi của các phương pháp trên, trước hết không có tùy chọn 'bao gồm':

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

Bản demo của Fiddle .

Và với tùy chọn 'bao gồm':

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

Bản demo của Fiddle .

Người giới thiệu:


6
Tại sao sử dụng áp dụng thay vì gọi trực tiếp như thế Main.min(a,b)nào? Function.prototype.apply chậm! Bên cạnh việc gọi nó khi bạn có một lượng đối số cố định là vô nghĩa.
Não thép

Tôi sẽ thêm phần này vào hộp công cụ mặc định của mình - rất tiện dụng và cảm ơn vì sự đóng góp này!
SidOfc

@SteelBrain: bạn có một điểm! Tôi đã cập nhật câu trả lời để phản ánh điều đó, mặc dù tôi nghi ngờ rằng tôi đã có - ban đầu - một lý do để sử dụng Function.prototype.apply(), nhưng tôi không thể nghĩ nó là gì, hoặc có thể là gì.
David nói phục hồi Monica

6
tốt hơn hết là tạo một hàm không sửa đổi Numberđối tượng. Đây là một mô hình chống và sẽ đến và cắn bạn nếu các tiêu chuẩn ECMA thay đổi để bao gồm một Number.between()hàm hoặc nếu một thư viện khác hoặc một đoạn mã Number.prototype.betweenkhác định nghĩa ở nơi khác với một định nghĩa khác. Thay vào đó, hãy tạo một hàm trợ giúp và sử dụng nó!
Monarch Wadia

2
@MonarchWadia Mặc dù quan điểm của bạn có ý nghĩa rằng sửa đổi / mở rộng các đối tượng bản địa là thực tiễn tồi, tôi cảm thấy có một chút dư thừa khi điều này được rao giảng ở khắp mọi nơi (không vi phạm). Tôi không thể đếm số lần tôi đã thấy "không sửa đổi các đối tượng bản địa". Đối với tôi, điều này giống như ai đó bán dao gia dụng cảnh báo người mua về những nguy hiểm có thể xảy ra của con dao mỗi khi anh ta bán một chiếc như trách nhiệm của người bán nếu có bất kỳ tổn hại nào. Những nguy hiểm nên là kiến ​​thức phổ biến. Nó nên tùy thuộc vào người dùng nếu anh ta / cô ta bỏ qua chúng hay không.
akinuri

80

Tôi thích đặt biến ở bên trong để đưa ra gợi ý thêm rằng mã đang xác thực biến của tôi nằm giữa một giá trị phạm vi

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

13
tôi thích phong cách này sẽ thích nghi với điều đó :)
Kaii

2
Đây là sở thích của tôi, vì nó gần gũi hơn với python của min < testval < maxcú pháp
daveruinseverything

@GouravChawla bạn đang nói về ví dụ đoạn mã trong câu trả lời này? Đoạn mã của tôi là Python, được sử dụng để so sánh
daveruinseverything

@GouravChawla không ai nói khác. Không rõ bạn không đồng ý với điều gì.
daveruinseverything

28

Đó là một câu hỏi cũ, tuy nhiên có thể hữu ích cho những người như tôi.

lodash_.inRange()chức năng https://lodash.com/docs/4.17.4#inRange

Thí dụ:

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

Xin lưu ý rằng phương pháp này sử dụng Lodashthư viện tiện ích và yêu cầu quyền truy cập vào phiên bản đã cài đặt của Lodash.


2
Xin lưu ý rằng giá trị cuối không được bao gồm. ví dụ. _.inRange(10, 0, 10) // => false
Lucio

Vì OP giới hạn phạm vi câu hỏi Javascript, nên lưu ý rằng phương pháp này sử dụng Lodashthư viện tiện ích và yêu cầu quyền truy cập vào phiên bản cài đặt của Lodash.
Chaya Cooper

2

Bạn có thể sử dụng nhiều mệnh đề trong ifđiều kiện thay vì viết

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

bởi vì điều này thực sự vô nghĩa khi JavaScript sẽ đọc nếu điều kiện của bạn như

windowSize > -100 

bởi vì nó tính toán 500-600để-100

Bạn nên sử dụng &&để kiểm tra nghiêm ngặt cả hai trường hợp, ví dụ như thế này

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

// Then doo something

}

0

Tôi vừa triển khai bit jQuery này để hiển thị và ẩn các giá trị phương thức bootstrap. Các trường khác nhau được hiển thị dựa trên phạm vi giá trị của mục nhập hộp văn bản người dùng.

$(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
Sử dụng jQuery cho các hàm tầm thường là vào năm 2013 có thể là một tùy chọn nhưng không phải hôm nay
mgamsjager

3
Đúng nhưng tôi e rằng mọi người vẫn sẽ sử dụng nó ngày hôm nay
mgamsjager 11/07/2016

1
Vì tò mò: tại sao bây giờ jQuery lại tệ hơn khi sử dụng cho các hàm tầm thường?
Julix

2
@Julix chủ yếu là hiệu suất, mặc dù không đáng kể trong trường hợp này. Điểm chung sẽ là "không sử dụng jQuery khi không cần thiết" nhưng những bình luận này không phải là nơi để (bắt đầu lại) cuộc tranh luận. hãy vui vẻ với điều này mặc dù :) i.stack.imgur.com/sGhaO.gif
Luca

Đây chỉ là một thực hiện của giải pháp. OP đã có quyền truy cập vào các giá trị. Vì vậy, jQuery $().val()là không liên quan và không cần thiết. Nhưng một lần nữa, trong phiên bản gốc của câu hỏi, OP đề cập đến jQuery, để kiểm tra số học đơn giản. (thở dài) Đó là sai lầm đầu tiên.
akinuri

0

Đây là phương pháp ngắn nhất có thể:

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

Tham số:

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

Bạn có thể chia cả hai bên cho 2 nếu bạn không hiểu cách thức đầu tiên hoạt động;)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.