Показать сообщение отдельно
  #4 (permalink)  
Старый 10.07.2017, 00:28
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

function isNumeric(value) { // ф-ия возвращает true или false, в зависимости от входящего значения, если аргумент приводится к числу, то true, иначе false
    var num = Number(value); // приводим к числу, Number('5') === 5
    return !Number.isNaN(num) && // Number('abs') is NaN
              Number.isFinite(num) && // num !== Infinity && num !== -Infinity
              value.constructor !== Array; // если входящий параметр массив [5], то, из-за правил приведения типов в js Number([5]) === 5, т.к. [5].toString() === '5', Number('5') === 5
}


arr
    .filter(value => isNumeric(value)) // получаем массив, где предикат isNumeric вернул true
    .reduce((agg, value) => agg + Number(value), 0); // складываем все значения отфильтрованного массива

// то же, что и выше только в "классическом" виде, отработает быстрее, т.к. мы один раз пройдемся по массиву, вместо двух
// код выше можно переписать, убрав filter и добавив проверку в callback функцию reduce для скорости
var agg = 0;
for(const value of arr) {
   if(isNumeric(value)) agg += Number(value);
}

Последний раз редактировалось EmperioAf, 10.07.2017 в 01:00.
Ответить с цитированием