У меня есть массив с 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");
}
.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()
используется, чтобы проверить, удовлетворяет ли КАЖДЫЙ элемент массива определенному условию, похоже, что вы хотите получить количество элементов, удовлетворяющих определенному условию. Невозможно сделать это без повторения каждого элемента массива и проверки. Thhis будет лучше, если вы просто напишите свой собственный цикл. например:
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;
Почему бы не использовать .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)
s.value
инвертировать логическое значение. var count = arrayObj.filter(function(s) { return !s.value; }).length;
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);
вы можете это сделать
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);
Я не совсем уверен, что вы на самом деле хотите: вы заявляете несколько раз, что хотите подсчитать, сколько элементов имеют 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);
Если это второй (вы хотите знать, являются ли все значения ложными), или вы хотите проверить, нет ли ни одного или только некоторые из записей имеют value
false
value
, вы можете добиться следующих результатов:
var allFalse = numFalse == data.length,
noneFalse = numFalse == 0,
someFalse = numFalse > 0 && numFalse < data.length;
Если вы не знакомы с reduce
, он работает следующим образом:
reduce
(нуль) устанавливает начальный отсчет в ноль.reduced
, причем первым значением является текущий счетчик, а второй - текущий элемент в массиве.value
свойства item value
false
, мы добавляем его к счету, иначе добавляем ноль.reduce
возвращает окончательное значение счетчика.Сделайте так, используйте 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);
<body>
This is an example.
<script>
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));
</script>
</body>
console.log()
document.write
вместоconsole.log()