使用javascript获取数组中的true / false值的数量

时间:2015-08-20 05:25:29

标签: javascript arrays angularjs arraylist

我有一个包含属性idvalue

的数组
 var arrayObj=  [
        {"id": 1, "value": true},
        {"id": 2, "value": false},
        {"id": 3, "value": true}
    ]

我需要获取具有属性true / false的对象的数量。 我正在使用Array.prototype.every(),但我的逻辑并没有像预期的那样正常工作。谁能告诉我这里我做错了什么?我没有显示计数

function checkIfFalse(value, index, ar) {
     document.write(value + " ");
     if (value  === false)
         return true;
     else
        return false;
}

if (arrayObj.every(checkIfFalse)) {
    console.log("all are false");
}else {
    console.log("all are true");
}

7 个答案:

答案 0 :(得分:3)

为什么不使用.filter



// Your array object
var arrayObj = [
  {"id": 1, "value": true},
  {"id": 2, "value": false},
  {"id": 3, "value": true}
]

// Count true items
var count = arrayObj.filter(function(s) { return s.value; }).length;

// Result
console.log("#True: " + count)




答案 1 :(得分:2)

你可以这样做

int falses=0,trues=0;
for(i=0;i<arrayObj.length;i++) {
    if(arrayObj[i].value) {
        trues++;
    } else {
        falses++;
    }
}
console.log('Trues: '+trues+' Falses:'+falses);

答案 2 :(得分:2)

var arrayObj = [{
    "id": 1,
    "value": true
}, {
    "id": 2,
    "value": false
}, {
    "id": 3,
    "value": true
}];

var trueCount = falseCount = 0;

arrayObj.forEach(function (object) {
    object.value === true ? trueCount++ : falseCount++;
});

console.log(trueCount, falseCount);

DEMO

答案 3 :(得分:1)

.every()函数期望传递一个函数,该函数将测试数组的每个项并返回true或false。你会想要这样的东西:

  if (arrayObj.every(checkIfFalse)) {
                console.log("all are false");
  }

 function checkIfFalse(value, index, ar) {
   console.log('checking if' + index + ' from array is false');
   return value.value == false;
 }

因此,arrayObj.every(checkIfFalse)将返回false,因为并非所有项都为假

.every()用于检查数组中的每个项目是否满足特定条件,听起来您想要计算满足特定条件的项目数。如果不迭代遍历数组的每个项目并进行检查,就无法做到这一点。如果你只是编写自己的for循环,这将是最好的。例如:

function countItemsTrue(arry){
   var result = 0;
   for(x = 1; arry.length >= x; x++){
      if(arry[x].value === true){
        result++;
      }
   }
   return result;

}

然后你会做

  var count = CountItemsTrue(arrayObj);

当它写成这样的时候你可以很容易地检查是否所有都是真的,而不是通过检查全部迭代:

  var allTrue = count == arrayObj.length;

答案 4 :(得分:1)

inMph dv

答案 5 :(得分:1)

我不完全确定你真正想要的是什么:你多次声明要计算有多少项false值,但你对代码的讨论让它听起来像你只想要知道他们所有是否有错value属性。

如果它是您第一次(假值的实际数量),您可以使用reduce获取该值,如下所示:

var arrayObj = [
    { "id": 1, "value": true },
    { "id": 2, "value": false },
    { "id": 3, "value": true }
];

var numFalse = arrayObj.reduce(function(count, item) {
    return count + (item["value"] === false ? 1 : 0);
}, 0);

如果是第二个(您想知道所有值是否为false),或者您想要检查是否只有部分条目有false value条目,你可以实现如下:

var allFalse = numFalse == data.length,
    noneFalse = numFalse == 0,
    someFalse = numFalse > 0 && numFalse < data.length;

如果您不熟悉reduce,则其工作方式如下:

  • reduce的第二个参数(零)将初始计数设置为零。
  • 对于数组中的每个项目,调用传递给reduced的函数,第一个值是当前计数,第二个值是数组中的当前项。
  • 如果商品的value属性为false,我们会在计数中添加一个,否则我们会添加零。
  • 最后,reduce返回计数的最终值。

答案 6 :(得分:1)

这样做,使用array.forEach而不是本机迭代。

var arrayObj=  [
    {
        "id": 1,
        "value": true
    },

    {
        "id": 2,
        "value": false
    },
    {
        "id": 3,
        "value": true
    }
];

var trueCount = 0, falseCount = 0;

arrayObj.forEach(function(index){
    if(index.value == true) {
        trueCount++;
    }
    else if(index.value == false){
       falseCount++;
    }
});

console.log('True Obj is '+trueCount+' False Obj is '+falseCount);