使用javascript获取数组中真/假值的数量
Posted
技术标签:
【中文标题】使用javascript获取数组中真/假值的数量【英文标题】:Get the number of true/false values in an array using javascript 【发布时间】:2015-11-13 14:47:41 【问题描述】:我有一个具有属性id
和value
的数组
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 真的吗?这很奇怪。对我来说,它适用于 false
和 null
。【参考方案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获取数组中真/假值的数量的主要内容,如果未能解决你的问题,请参考以下文章