Получить количество истинных / ложных значений в массиве, используя JavaScript

0

У меня есть массив с 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");
}
  • 1
    удалите console.log() document.write вместо console.log()
  • 0
    логика не имеет смысла для меня. нет (все ложно)! = все верно
Показать ещё 1 комментарий
Теги:
arrays
arraylist

7 ответов

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() используется, чтобы проверить, удовлетворяет ли КАЖДЫЙ элемент массива определенному условию, похоже, что вы хотите получить количество элементов, удовлетворяющих определенному условию. Невозможно сделать это без повторения каждого элемента массива и проверки. 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;
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)
  • 0
    Как вы можете использовать .filter, чтобы найти только ложные предметы?
  • 0
    @ socca1157 Просто добавьте "!" до s.value инвертировать логическое значение. var count = arrayObj.filter(function(s) { return !s.value; }).length;
Показать ещё 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

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

Если это второй (вы хотите знать, являются ли все значения ложными), или вы хотите проверить, нет ли ни одного или только некоторые из записей имеют 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 возвращает окончательное значение счетчика.
  • 0
    Мне это нравится, так как это отличное решение, которое, несомненно, вызовет у автора проблемы, если это будет домашняя работа, а не реальная проблема.
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);
1
<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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню