使用javascript获取数组中真/假值的数量

Posted

技术标签:

【中文标题】使用javascript获取数组中真/假值的数量【英文标题】:Get the number of true/false values in an array using javascript 【发布时间】:2015-11-13 14:47:41 【问题描述】:

我有一个具有属性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");

【问题讨论】:

去掉document.write,改用console.log() 这个逻辑对我来说没有意义。不是(全部为假)!=全部为真 我建议你可以直接使用for循环 【参考方案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);

【讨论】:

【参考方案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】:

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

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

Array.prototype.numBoolean = function(condition) 
  var counter = 0;

  for (var i = 0; i < this.length; i++) 
    if (this[i].value === condition) 
      counter++;
    
  
  return counter;
;

console.log(arrayObj.numBoolean(true));
console.log(arrayObj.numBoolean(false));

【讨论】:

【参考方案4】:

为什么不使用.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);

【讨论】:

如何使用 .filter 只查找虚假项目? @socca1157 只需添加“!”在s.value 之前反转布尔值。 var count = arrayObj.filter(function(s) return !s.value; ).length; 我试过了,但不允许我与 false 或 null 值进行比较。我最终将 var 转换为字符串并以这种方式进行直接比较。谢谢! @socca1157 真的吗?这很奇怪。对我来说,它适用于 falsenull【参考方案5】:

我不完全确定您真正想要什么:您多次声明您想计算有多少项目具有 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 value 条目,您可以实现如下:

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

如果您不熟悉reduce,它的工作原理如下:

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

【讨论】:

我喜欢这个,因为它是一个很好的优雅解决方案,如果它恰好是家庭作业而不是实际问题,肯定会给海报带来麻烦【参考方案6】:

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

  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;

【讨论】:

【参考方案7】:

你可以这样做

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

【讨论】:

以上是关于使用javascript获取数组中真/假值的数量的主要内容,如果未能解决你的问题,请参考以下文章

Python/Pandas,.count 不适用于更大的数据框

JavaScript 真值和假值

javaScript真值和假值以及相等操作符

PySpark - 获取具有相同值的数组元素的数量

Falsy Bouncer 过滤数组假值

Falsy Bouncer(过滤数组假值)