Многомерный логический массив, проверяющий, все ли 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
}