странный вывод комбинации $ .each и функции jQuery.inArray - PullRequest
0 голосов
/ 31 января 2012

Мой полный код:

jQuery.extend({

combinationCheck: function (p1position) {

    var Combination = [1, 2, 3, 4, 5, 6, 7, 8];
    Combination[0] = [1, 2, 3];
    Combination[1] = [4, 5, 6];
    Combination[2] = [7, 8, 9];
    Combination[3] = [1, 4, 7];
    Combination[4] = [2, 5, 8];
    Combination[5] = [4, 6, 8];
    Combination[6] = [1, 5, 9];
    Combination[7] = [3, 5, 7];


    $.each(p1position, function (index, value) {

        var num = value;

        if ($.inArray(String(value), Combination[1]) != '-1') {
            alert("there");
        }
        else {
            alert("not there");
        }

    });
});

так что работает. Если бы я должен был установить num на 5, он предупреждает «есть», а для 8 -> «нет». но проблема в том, что у меня есть другой массив.

p1position = [1,5];

и пройти через массив ..

$.each(p1position,function(index,value){
    var num = value;
//then call the jQuery.inArray function as written above, it always return not there. even though 5 is in the Combination[1] array.
});

Я так запутался, пытаясь решить эту проблему часами.

1 Ответ

0 голосов
/ 31 января 2012

Конкретная проблема с вашим кодом, о котором вы спрашиваете, заключается в том, что перед проверкой вы превращаете значение в строку:

if ($.inArray(String(value), Combination[1]) != '-1') {
//            ^^^^^^^^^^^^^

inArray выполняет проверку === (строгое равенство) и "1" !== 1. Эта строка должна гласить:

if ($.inArray(value, Combination[1]) !== -1) {

Изменения:

  1. Не превращайте value в строку.

  2. Сравните результат с -1 (число), а не "-1" (строка). inArray возвращает число.

  3. Используйте !== вместо != (это в основном вопрос стиля, вы можете использовать !=, если хотите).


Существует несколько других проблем с этим кодом.

  1. Вам не хватает }, поэтому код, который вы говорите - ваш полный код, не анализируется.

  2. Вы воссоздаете Combination каждый раз, когда вызывается combinationCheck. Если ваша цель - создать игру «Крестики-нолики», вам необходимо иметь возможность сохранять состояние Combination между проверками.

Вот довольно минимальный набор исправлений:

(function() {
    var Combination = [
            [1, 2, 3],
            [4, 5, 6],
            [7, 8, 9],
            [1, 4, 7],
            [2, 5, 8],
            [4, 6, 8],
            [1, 5, 9],
            [3, 5, 7]
        ];

    jQuery.extend({

        combinationCheck: function (p1position) {

            $.each(p1position, function (index, value) {

                if ($.inArray(value, Combination[1]) !== -1) {
                    alert(value + " is there");
                }
                else {
                    alert(value + " is NOT there");
                }

            });
        }
    });

})();

... который дал:

jQuery.combinationCheck([1, 5]);

... сообщает, что 1 не найден, но 5 есть.

Живая копия

...