【问题标题】:Multidimensional boolean array checking if all true in Javascript多维布尔数组检查Javascript中是否全部为真
【发布时间】:2023-03-26 05:02:01
【问题描述】:

我有一个多维布尔数组,每个元素都设置为 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 = [true,true,true,true,true,true,true,true,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 是否全部正确的任何想法?

【问题讨论】:

  • 只需迭代所有行和列,如果任何元素 = false 返回 false 否则返回 true...公开一个 isAllTrue 方法
  • @Paul,如果第一个单元格是真的,你返回的是真的吗?你需要搜索整个数组,然后返回true。
  • 否,如果循环的所有迭代都失败,则返回 true(全部为 true)
  • 看看我对所有 Log(On) 算法的按位替代
  • 请注意,boolarray[i] 行(在 for 循环打开后立即{)没有任何作用。

标签: javascript jquery multidimensional-array boolean


【解决方案1】:

使用.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))

【讨论】:

  • MDN 对 .every() 的引用告诉我它需要一个函数。传递Boolean 是如何工作的?看起来确实是 :) 我将第一个示例中的一个值更改为 false,果然它返回了 false。看起来传递给回调的第一个参数是值,而不是数组。
  • @jinglesthula: typeof Boolean === "function"; // true :-) Boolean 函数在不用作构造函数时只需将其第一个参数转换为布尔值并返回它。因此,在这些示例中,它采用 true 值,并返回 true
  • 注意,空数组也会导致返回true,这是不正确的。 [].every(Boolean); 将产生 true
  • @codenamezero:确实如此,但您声称它不正确是主观的。没有“正确”的结果。因为truefalse 都有些误导,所以只有一个人决定他们想要在那种情况下得到什么。如果你想要false,你可以做!!boolarray.length &amp;&amp; boolarray.every(Boolean);
  • 是的,需要进行长度检查。我只是把这个扔在这里,以便人们知道。
【解决方案2】:

作为使用布尔数组的替代方法,为什么不使用简单的十六进制数来存储您的电路板(然后使用位操作来更改/测试),即

000 000 001

==

1 进制

111 111 111

==

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

将棋盘位置设置为真或假将变成一个位操作,测试将变得像 parseInt = 511 一样简单...

bit manipulation in javascript

【讨论】:

  • 这很有趣,我会研究这个以备将来学习,谢谢。
  • 没问题 - 请注意,此方法将需要尽可能多的编码,但会更快(parseInt 在 javascript 引擎中进行了优化,而不是 Log(On),即数组越大,所需的时间越长。案例和更小的内存占用
  • 此外,这适用于您必须迭代数组进行测试的所有实例,即“所有值是否为假”= parseInt == 0?并且“任何一点都是真的”= parseInt > 0
【解决方案3】:

您需要再次循环遍历数组以检查所有值;与您分配它们的方式非常相似:

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;

【讨论】:

    【解决方案4】:

    编写一个在给定参数(我们的二维数组)上运行循环的函数,并检查每个单元格是否为真。如果不是,则返回 false。 循环结束后,返回true;

    【讨论】:

      【解决方案5】:
      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;
                      }
                    };
                  };     
      

      【讨论】:

        【解决方案6】:

        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 库之一

        【讨论】:

          【解决方案7】:

          您的名为 boolArray 的变量是一个数组,只要它不为空,您编写的代码就会将其设为 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];
              }
          }
          

          【讨论】:

            【解决方案8】:
            for(var i in boolarray)
                if(!boolarray[i]) return false;
            
            return true;
            

            ...这是基于您的陈述:

            boolarray = [true,true,true,true,true,true,true,true,true]

            这不是多维数组。

            【讨论】:

            • 他的循环表明他将 3 个布尔值存储在一个对象数组中,该对象数组是一个多维数组 [i][j]
            • @PaulSullivan - 当他说“这就是它给我的”并表示一个平面数组时,很难知道操作的代码是否就是它。我理解循环,但最后一点信息(尽管如此)是 op 使用一维数组。
            • @PaulSullivan 你确定吗?您在假设代码 sn-p 是用于创建boolarray 的假设下进行操作?为什么,当操作明确声明var boolarray= $.extend(true, [], board); 时?初始化board的代码在哪里?另一方面,我假设以一种或另一种方式,操作在代码执行后拥有他所拥有的:boolarray = [true,true,true,true,true,true,true,true,true]
            • 但元素的迭代表明它是一个多 boolarray[i][j] = true;... 我同意这是一个有争议的点,他可以轻松地使用单个 dim 数组并且只是 multiplex数组。
            • @PaulSullivan 是的。我想我的意思是 - 在我们看到 board 的创建位置/方式之前,我们无法确定数据是什么。鉴于此,我选择将我的答案基于操作员所说的他的数据包含他的逻辑被应用之后。
            【解决方案9】:
            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());​
            

            小提琴here

            【讨论】:

            • 原型设计数组是一个灰色区域(我已经阅读了很多不推荐的材料,因为很多事情(损坏的关联数组行为和其他损坏的 ECMA 东西......处理 Array.prototype小心
            【解决方案10】:

            检查任意深度的嵌套数组的递归版本:

            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";
            });
            

            【讨论】:

              【解决方案11】:

              使用 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/

              【讨论】:

                猜你喜欢
                • 2013-09-18
                • 2021-03-12
                • 2022-07-31
                • 1970-01-01
                • 2019-08-07
                • 2013-09-09
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多