9

各要素が true に設定された bool の多次元配列があります。

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 = [真、真、真、真、真、真、真、真、真]

すべての要素が true かどうかを確認し、そうであれば戻りたいと思います。ただし、以下の私の方法は機能しません。

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 がすべて true かどうかを確認する方法についてのアイデアはありますか?

4

11 に答える 11

29

使用.every()...

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

boolarray.every(Boolean);

デモ: http://jsfiddle.net/gFX7X/


最初のループの唯一の目的が 2 番目のループを作成することである場合は、それをスキップしてこれを行うことができます...

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))
于 2012-04-10T22:17:29.537 に答える
3

ブール配列を使用する代わりに、単純な 16 進数を使用してボードを保存しないでください (そして、ビット操作を使用して変更/テストします)。

000 000 001

==

10進数

111 111 111

==

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

ボードの位置を true または false に設定すると、ビット操作になり、テストは parseInt = 511 と同じくらい簡単になります...

JavaScript でのビット操作を参照してください

于 2012-04-10T22:16:09.123 に答える
1

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];
    }
}
于 2012-04-10T22:13:32.383 に答える
1

指定されたパラメーター (2 次元配列) でループを実行し、各セルが true かどうかをチェックする関数を作成します。そうでない場合は、false を返します。ループの後、true を返します。

于 2012-04-10T22:08:10.637 に答える
1

すべての値を確認するには、配列を再度ループする必要があります。それらを割り当てた方法と非常によく似た方法で:

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;
于 2012-04-10T22:08:40.750 に答える
1
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;
                }
              };
            };     
于 2012-04-10T22:08:49.720 に答える
1
for(var i in boolarray)
    if(!boolarray[i]) return false;

return true;

...これはあなたの声明に基づいています:

boolarray = [真、真、真、真、真、真、真、真、真]

これは多次元配列ではありません。

于 2012-04-10T22:09:36.413 に答える
1

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この例は、ループ関数から返された結果を返すという事実を利用しています。値が返されるとすぐfalsyに、反復も停止します。

古いブラウザのライブ IE6/7 との互換性を維持する必要がある場合は、多くの ES5 shim ライブラリの 1 つをダウンロードするだけです。

于 2012-04-10T22:12:25.517 に答える
1
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());​

ここでフィドル。

于 2012-04-10T22:16:33.520 に答える
0

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/

于 2014-07-22T14:32:55.750 に答える
0

任意の深さのネストされた配列をチェックする再帰バージョン:

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";
});
于 2014-01-23T21:48:46.590 に答える