Значение проверки JavaScript в нескольких диапазонах в многомерном массиве - PullRequest
1 голос
/ 22 июня 2011

Я столкнулся с проблемой в моем сценарии проверки для проверки австралийских почтовых индексов. Кажется, он не увеличивается с помощью многомерного массива, который содержит значения почтового индекса.

Вот функция:

function validateAustralia(postcode, ranges) {

           for (var i = 0; i < ranges.length; i++) {
                     console.log(i);
//returns only 0, when it should return 0, 1, 2.
                     console.log("postcode: " + postcode + " " + "ranges: " + ranges);
//returns postcode: 2000 ranges: 200,299,2600,2618,2900,2920
                     console.log("ranges - low: " + ranges[2][0] + " " + "ranges - high: " + ranges[2][1]);
                     //returns ranges - low: 2900 ranges - high: 2920
                if (postcode >= ranges[i][0] && (postcode <= ranges[i][1])) {
                     valid = true;
                     //confirmation();
                     //break;
                } else {
                     inelegible();
                     return false;
                }
           }
     }

Для Нового Южного Уэльса, например

ranges = [ [1000, 2599], [2619, 2898], [2921, 2999] ];

возвращается только 1000 и 2599 - то есть диапазоны [0] [0] и диапазоны [0] [1] поэтому кто-то вводит почтовый индекс для Dubbo (который находится в Новом Южном Уэльсе), считается недействительным, потому что его почтовый индекс - 2830 - не между 1000 и 2599.

jQuery $ .each () выполняет итерацию по первому массиву правильно, но я не уверен, как получить значения из массива второго уровня.

Edit: ОК, так было поздно ночью, и я слепой. Коджиро имеет большую часть ответа ниже, и друг здесь также указал на это: я заканчиваю итерацию после первого прогона. Я переместил цикл if else вне итерации и просто проверил, находится ли почтовый индекс в пределах диапазона. Если есть, это действительно. Затем, если valid = true, я вызываю функцию подтверждения, а все остальное хорошо:

function validateAustralia(postcode, ranges) {
    for (var i = 0; i < ranges.length; i++) {
            console.log(i);
            // returns 0, 1, 2 ...
            console.log("postcode: " + postcode + " " + "ranges: " + ranges);
            // for Dubbo (2830), for example, returns postcode: 2830 ranges: 1000,2599,2619,2898,2921,2999
            console.log("ranges - low: " + ranges[i][0] + " " + "ranges - high: " + ranges[i][1]);
            // returns  ranges - low: 1000 ranges - high: 2599,
            //          ranges - low: 2619 ranges - high: 2898, ...


        if (postcode >= ranges[i][0] && (postcode <= ranges[i][1])) {
            valid = true;
        //  alert("valid =" + valid);
        } 
        if (valid === true) {
            confirmation();
            // all good
        } else {
            inelegible();
            // Sorry, mate
        }
    }
}

Поскольку я здесь новичок (долгое время слушатель, впервые звонящий), я не могу ответить на свой вопрос, но на самом деле это все.

Вот HTML и вызывающая функция для @nnnnnn и всех, кто хочет посмотреть: Пользователь выбирает свое состояние из выбора

<select id="states" name="states">
     <option selected="" value="">Please choose ...</option>
        <optgroup label="Australia" id="australia">
        <option value="act">Australian Capital Territory </option>
        <option value="nsw">New South Wales </option>
      <!-- ...and so on for the rest of the states -->

и вводит свой почтовый индекс в текстовое поле

<input id="postcode" name="postcode" type="text" maxlength="4" />

который я получаю таким образом

postcode = $('#postcode').val();

и проверка по диапазону значений почтового индекса

function checkAustralia(state, postcode, ranges) {  
    //      has to be in the range of values
        switch (state) {
            //Australian states
            //match the whole postcode
            //postcodes with a leading '0' are validated as whole numbers without the '0'
        case 'act':
            ranges = [ [200, 299], [2600, 2618], [2900, 2920] ];
            validateAustralia(postcode, ranges);
            break;
        case 'nsw':
            ranges = [ [1000, 2599], [2619, 2898], [2921, 2999] ];
            validateAustralia(postcode, ranges);
            break;
// ...and so on for the rest of the states

1 Ответ

1 голос
/ 22 июня 2011

Ваша функция возвращает false, как только проверяется первый диапазон.Измените эту логику: return true, если значение равно в диапазоне, но возвращать false только в том случае, если цикл полностью исчерпан.

Кроме того, ваш код не всегда явно возвращает значение,Это, очевидно, не проблема, но это может быть связано с путаницей здесь.

...