检查javascript数组是否为二进制的快速方法(仅包含0和1)

时间:2018-04-09 23:58:09

标签: javascript arrays binary boolean

确定阵列是否仅由0和1组成的快速方法是什么?

我模糊地熟悉一个布尔解决方案,但我不知道如何实现它。为了实现,您必须为布尔值

赋值
true = 0 

false = 1 

但是如果你得到一个这样的数组

,你将如何实现呢?
array = [1,1,1,1,0,0,0,0]

isArrayBool (){ 

}

3 个答案:

答案 0 :(得分:3)

非常天真的解决方案:



function isArrayBool(array) {
    for (var i of array) {
         if (i !== 0 && i !== 1) return false;
    }
    return true;
}

console.log(isArrayBool([1,0,0,0,1]));   // true
console.log(isArrayBool([1]));           // true
console.log(isArrayBool([2,3,0]));       // false




答案 1 :(得分:1)

所以我在jsperf中将几个函数放在一起进行测试。到目前为止我找到的最快的是下面的那个(比for of版本快得多):

function isBoolFor(arr) {
  for(var i=arr.length-1; i>=0; --i){
    if(arr[i] !== 0 && arr[i] !== 1) return false
  }
  return true
}

比较是here

编辑:我玩了另一个更快的版本:

function isBoolFor(arr) {
  for(var i=0; arr[i] === 0 || arr[i] === 1; i++){}
  return i === arr.length
}

这里的关键是因为你检查的大多数数组都是由0和1组成的,你可以避免每次迭代使用||而不是&&否定检查进行两次布尔检查。这只是一个微妙的改进,可以说在实践中并不比上面的更好。

更新:因此,所有for和while变体之间的差异太微妙,无法宣布总冠军。所以在这种情况下我会考虑可读性。如果你想要二进制使用类型数组!

最终更新:

我很好奇并希望找到一个更快的版本,如果已知阵列只是数字就可以完成。如果数组仅包含数字,则可以对所讨论的任一值使用按位运算符检查。例如:

function isBoolFor(arr) {
  const test = ~0x01
  for(var i=arr.length-1; i>=0; --i){
    if(test & arr[i]){ return false }
  }
  return true
}

答案 2 :(得分:0)

https://jsperf.com/bool-array-test-2/1

正如我们在这里看到的,最快的方法可以在这里看到......使用简单的for循环,如用户Jaromanda在评论中所建议的那样。这个for循环在速度方面将其他解决方案从水中吹出。

(byebug) @account.valid?
  Account Exists (0.6ms)  SELECT  1 AS one FROM "accounts" WHERE LOWER("accounts"."subdomain") = LOWER($1) LIMIT $2  [["subdomain", "taurengroup"], ["LIMIT", 1]]
  User Exists (0.4ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "xxxxxx@xxxxxx.com"], ["LIMIT", 1]]
false
(byebug) @account.errors
#<ActiveModel::Errors:0x007faf15f91660 @base=#<Account id: nil, subdomain: "taurengroup", owner_id: nil, plan_id: nil, phone_verified: false, email_verified: false, account_active: false, created_at: nil, updated_at: nil>, @messages={:"owner.account"=>["must exist"]}, @details={:"owner.account"=>[{:error=>:blank}]}>