检查对象数组是否包含布尔值true/false

Check if object array contains boolean true/false

本文关键字:true false 包含布 对象 数组 是否 检查      更新时间:2023-09-26

我有一个数组对象,其中每个数组默认为[false,false],并且它对应于一个有yes和no选项的复选框。如果用户选择"是",则数组将更新为[true,false],如果用户回答"否",则阵列将更新[false,true]。

我的对象的可视化表示

Object
   |
   |-> 1 
       |-> [false,false]
   |-> 2 
       |-> [false,false]
...

我尝试了以下操作,但这不是我所需要的,因为它似乎没有检查数组的第二个索引。

  for (var idx = 1; idx <=6  ; idx++)   {
    if (DataObj[idx].indexOf(true))
    {
      console.log("Not Answered");
    }
    else 
    {
      console.log("Answered");
    }

代码输出

[true, false]
Answered
[false, true]
Not Answered

预期输出

[true, false]
Answered
[false, true]
Answered
[false, false]
Not answered

我也试过($.inArray(true, DataObj[idx])),但它不起作用,或者我错过了一些东西。我的方向对吗?

$.inArray(item, array)Array.prototype.indexOf(item)都返回数组中项目的索引(如果找到),否则返回-1。if (a.indexOf(x))仅检查索引是否为零。您必须检查索引是否不是-1,或者至少为零:

for (var idx = 1; idx <=6  ; idx++)   {
    if (DataObj[idx].indexOf(true) >= 0)

您当前只检查数组中是否有"true"。如果是,它将只返回true的FIRST索引,您可以使用lastIndexOf(true)但逻辑可能会开始变得棘手

您还需要在indexOf()中添加一个小检查,它要么返回-1,要么返回索引,所以-1意味着它不在那里:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf

更好的是,你可以像这样循环通过你的对象一样循环通过这个数组:

  for (var idx = 1; idx <=6  ; idx++)   {
    var array = DataObj[idx];
    for (var i = 0; i < array.length; i++) {
      // here you will loop through the entire array and see both 'i' indexes
    }
    if (DataObj[idx].indexOf(true) > -1) // you need to do this here as well
    {
      console.log("Not Answered");
    }
    else 
    {
      console.log("Answered");
    }

您可以将Array#some()Boolean一起用作回调。

var object = { 0: [true, false], 1: [false, true], 2: [false, false] };
document.write(Object.keys(object).map(function (k) {
    return object[k].some(Boolean) ? 'Answered' : 'Not answered';
}).join('<br>'));

您可以使用reduce函数和logic OR||

var j = { 1: [true, false], 2: [false, true], 3: [false, false] };
var r = Object.keys(j).map(e => j[e].reduce((p, c) => p || c, false));
document.write(r.map(e => e ? ' Answered' : ' Not answered '))

我最终使用了以下作为解决方案

  for (var idx = 1; idx <=6  ; idx++)   {
    qcomplete = qcomplete + (surveyDataObj[idx][0] ? 1 : 0);
    qcomplete = qcomplete + (surveyDataObj[idx][1] ? 1 : 0);
  }

我建议使用jQuery。

var a = {
  a1: [false, false]
};
$("#b1").change(function() {                 // <-- when checkbox status is changing
  if($(this).is(":checked")){
    a.a1[0]=true;
    a.a1[1]=false;
    $("body").append(JSON.stringify(a.a1));  // <-- just for the output
  }else{
    a.a1[0]=false;
    a.a1[1]=true;
    $("body").append(JSON.stringify(a.a1));  // <-- just for the output
  }
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="b1" type="checkbox"></input>