Многомерный логический массив, проверяющий, все ли true в Javascript

у меня есть многомерный массив bools, с каждым элементом, установленным в true:

var boolarray= $.extend (true, [], board);

board представляет собой многомерный массив строк 3x3. boolarray просто полное копирование.

     for (var i=0; i < boolarray.length; i++) {
              boolarray[i]
              for (var j=0; j < boolarray[i].length; j++) {
                boolarray[i][j] = true;
              };
            };     

это дает мне:

boolarray = [подлинный,истинный,настоящий,подлинный,истинный,настоящий,подлинный,истинный,настоящий]

Я хочу проверить, все ли элементы истинны и вернуться, если это так. Однако мой метод не работа.

if (boolarray == true)
{
console.log("all elements in boolarray are true, return true ")
return true;
}
else 
{
console.log("not all elements in boolarray are true, return false")
return false;
}

любые идеи о том, как я должен проверить, все ли boolarray верно?

11 ответов


вам нужно будет снова пройти через массив, чтобы проверить все значения; очень похоже на то, как вы их назначили:

for (var i=0; i < boolarray.length; i++) {
    for (var j=0; j < boolarray[i].length; j++) {
        if (boolarray[i][j] == false) {
            return false;
        }
    };
}; 

return true;

использовать .every()...

var boolarray = [true,true,true,true,true,true,true,true,true];

boolarray.every(Boolean);

демо: http://jsfiddle.net/gFX7X/


если единственной целью первого цикла было создание второго, то вы можете пропустить его и сделать это...

var boolarray = [[true, true, true], 
                 [true, true, true], 
                 [true, true, true]];

boolarray.every(function(arr) {
    return arr.every(Boolean)
}); 

демо: http://jsfiddle.net/gFX7X/1/


или немного более короткая версия предыдущей:

boolarray.every(Function.call.bind(Boolean, null))

в качестве альтернативы использованию логического массива почему бы не использовать простое шестнадцатеричное число для хранения вашей платы (а затем использовать битную манипуляцию для изменения/тестирования), т. е.

000 Ноль ноль ноль 001

==

1decimal

111 Сто одиннадцать 111

==

511 (256 + 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1)

установка положения платы true или false затем станет немного манипуляцией, а тестирование станет таким же простым, как parseInt = 511...

посмотреть бит манипуляции в javascript


напишите функцию, которая запускает цикл по заданному параметру (наш 2d-массив), и проверяет каждую ячейку, если true. Если нет, то вернуть false. После цикла верните true;


bool alltrue = true;
for (var i=0; i < boolarray.length; i++) {
              boolarray[i]
              for (var j=0; j < boolarray[i].length; j++) {
                if(boolarray[i][j] != true) {
                    alltrue = false;
                }
              };
            };     

пример обозначения ES5 (упрощенный):

var foo = [ [true, true, true], [true, true], [true, true], [false, true], [true, true] ];

var boolarray = foo.every(function(level2, i) {
    return level2.every(function(bool) {
        return bool;
    });
});

этот пример использует тот факт, что Array.prototype.every возвращает результат, возвращенный функцией loop. Как только falsy возвращается значение, итерация также останавливается.

Если вам нужно оставаться совместимым со старыми браузерами IE6/7, Вы можете просто загрузить одну из многих библиотек ES5 shim там


ваша переменная с именем boolArray является массивом, и пока она не равна null, код, который вы написали, будет видеть ее как true, чтобы получить то, что вы хотите, вам нужно что-то вроде этого:

var boolArrayValue = true; // valor final a usar es boolarray value
for(var i = 0;i<boolarray.length;i++){
    for(var a = 0;a<boolarray[i].length;a++){
        boolArrayValue = boolArrayValue && boolarray[i][a];
    }
}

for(var i in boolarray)
    if(!boolarray[i]) return false;

return true;

...это основано на вашем заявлении:

boolarray = [подлинный,истинный,настоящий,подлинный,истинный,настоящий,подлинный,истинный,настоящий]

это не многомерный массив.


boolarray = [true,true,true,true,true,true,true,true,true];
Array.prototype.isFalse=function(){
    for(var i=0;i<this.length;i++)
    {
        if(this[i]!=true) return false;
    }
    return true;
};
alert(boolarray.isFalse());​

скрипка здесь.


рекурсивная версия, которая проверяет вложенные массивы произвольной глубины:

function deepEvery(arr, fn, _this) {
    return (function iterate(arr, i) {
        var len = arr && arr.length;
        if (!len || i >= len) {
            return false;
        }
        var first = arr[i] && typeof arr[i].splice === "function" 
            ? iterate(arr[i], 0) 
            : fn.call(_this || this, arr[i], i);
        i += 1;
        return !!first && (i >= len || iterate(arr, i));
    })(arr, 0);
}

использование:

deepEvery([[true, true, true], 
           [true, true, true], 
           [true, true, true]], function(el, i) {
    return el;
});

обратите внимание, что это позволяет для любого типа проверки в обратном вызове. Если функция, которую вы передаете deepEvery возвращает false для любого элемента, то общий результат false; в противном случае, результат true. Пример:

deepEvery([4, true, [6, [5, "F"], 6]], function(el, i) {
    return typeof el === "number";
});

С помощью С помощью jQuery.grep () и С помощью jQuery.map ():

var flattenedBoolarray = $.map(boolarray, function recurs(n) {
    return ($.isArray(n) ? $.map(n, recurs): n);
});

if ($.grep(flattenedBoolarray, function(e, i){return e}, true).length) {
    // In case if any isn't true
} else {
    // In case if all are true
}

демо:http://jsfiddle.net/tYSu6/