посчитать вхождения в массив

350
03 марта 2017, 01:33

Считаю вхождения true в массив. Помогите разобраться как сделать проверку на 0, undefined, null

var array1 = [true, true, true, false, 
  true, true, true, true, 
  true, false, true, false, 
  true, false, false, true, 
  true, true, true, true, 
  false, false, true, true 
]; 
 
 
function countSheeps(arrayOfSheep) { 
  var count = 1; 
  arrayOfSheep.reduce(function(previousValue, currentValue, index, array) { 
 
    if (currentValue === true) 
      count++; 
  }); 
  return count; 
} 
 
console.info(countSheeps(array1));

  1. Не пойму почему если поставить count = 0, количество true считается не верно.
  2. Если передать пустой массив, не пойму как вывести 0.

Хочу понять как можно просто посчитать число вхождений true в массив, при этом учесть проверку на null и undefined

Answer 1

Надо делать так:

function countSheeps(arrayOfSheep) { 
  return arrayOfSheep ? arrayOfSheep.reduce(function(count, value) { 
    return count + (value === true); 
  }, 0) : 0; 
} 
 
console.log(countSheeps([true, true, true, false, 
  true, true, true, true, 
  true, false, true, false, 
  true, false, false, true, 
  true, true, true, true, 
  false, false, true, true 
])); 
 
console.log(countSheeps([])); 
console.log(countSheeps(null)); 
console.log(countSheeps()); 
console.log(countSheeps([1,2,3,true,false,"true",17,null]));

Не пойму почему если поставить count = 0, количество true считается не верно.

Потому что в твоей реализации первое значение в массиве вообще не обрабатывается.

Answer 2

Вы неправильно используете .reduce

var array1 = [true, true, true, false, 
  true, true, true, true, 
  true, false, true, false, 
  true, false, false, true, 
  true, true, true, true, 
  false, false, true, true 
]; 
 
 
function countSheeps(arrayOfSheep) { 
  return (arrayOfSheep||[]).reduce(function(previousValue, currentValue, index, array) { 
 
    if (currentValue === true) 
      previousValue++; 
    return previousValue; 
  }, 0); 
}; 
 
const countSheeps2 = list => (list||[]).reduce((c, s)=>s===true?c+1:c, 0) 
 
console.info(countSheeps(array1)); 
console.info(countSheeps2(array1));

Answer 3

Функция "магическим" способом, подсчитывает количество true в массиве

var array1 = [true, true, true, false, true, true, true, true, true, false, true, false, true, false, false, true, true, true, true, true, false, false, true, true]; 
 
 
function countSheeps(arrayOfSheeps) { 
  return arrayOfSheeps.filter(Boolean).length; 
} 
 
 
console.info(countSheeps(array1));

READ ALSO
TypeError: Не удается вызвать метод “getRange” объекта null

TypeError: Не удается вызвать метод “getRange” объекта null

Суть скрипта в отправке сообщения на почту, адрес которой берется из таблицы Google, вы выполнении выдает ошибку: TypeError: Не удается вызвать метод...

968
dxDatagrid LookUp column DataSource

dxDatagrid LookUp column DataSource

ЗдравствуйтеИспользую devExpress для js есть таблица dxdataGrid c datasource и столбец реализующий выпадающий список через lookup, ссылающийся на свой dataSource,...

616
Изменения классов JS

Изменения классов JS

При изменении class="main main-active", block active меняется в диве main, а не main-activeКак исправить что бы active в div

308
Hover-эффект в навигации bootstrap

Hover-эффект в навигации bootstrap

Не могу найти, где задается hover-эффект для элементов навигацииПри наведении на элемент меню появляется белый бэкграунд (см

385