тут даже будет объявляться функция summ которая берет на вход функцию arraySum
а есть разница ? то есть лучше делать как ты написал или как я ?
лучше делать как написал andy_gold , во избежание ненужного кода, попробуй написать и вывести в консульку 2 варианта, и сразу поймешь.
Лучше сразу почитать про именование, определения функций. Аргументы функций, которые она принимает.
http://javascript.ru/basic/functions
reduce - arr.reduce(function(a,b){return(a+b)}) -
для данного случая
Массив заполняется посредством введенных пользователем чисел. При выводе суммы, как таковую не выводит. В чем ошибка?
var UserInput,
EnteredNumbers = [];
var finish = ‘exit’;
while(UserInput != finish) {UserInput = prompt(‘Введите любое число’); EnteredNumbers.push(UserInput);}
EnteredNumbers.pop();
console.log(EnteredNumbers);
var sum = 0;
for (i=0; i < EnteredNumbers.length; i++) {
sum = sum + EnteredNumbers[i];}
console.log (‘Сумма элементов массива:’ +sum);
Функция prompt
, которая используется для наполнения массива EnteredNumbers
, возвращает строковое значение. Поэтому в цикле происходит конкатенация строк, а не суммирование чисел. Используй parseFloat
для распарсивания строк в числа.
parseFloat('1.99') // 1.99
parseFloat('1') // 1
Есть нюанс: parseFloat
не понимает запятую как разделитель:
parseFloat('1,99')
, но это уже нюансы обработки пользовательского ввода.
var UserInput,
EnteredNumbers = [];
var finish = 'exit';
while(UserInput != finish) {UserInput = prompt('Введите любое число'); EnteredNumbers.push(parseFloat(UserInput));}
EnteredNumbers.pop();
console.log(EnteredNumbers);
var sum = 0;
for (i=0; i < EnteredNumbers.length; i++) {
sum = sum + EnteredNumbers[i];}
console.log ('Сумма элементов массива:' +sum);
А что если в массив будут записаны не только числа, но и буквы? Каким оператором можно их пропускать?
Предположу что удобнее было вычленить только числа без учета того какие данные других типов могут быть в массиве. Пример такого решения и опишу.
В js дикая система определения типов (тут подробнее https://bonsaiden.github.io/JavaScript-Garden/ru/#types), и единственный 100% способ определить что в переменной variable
находится число, выглядит так:
if (Object.prototype.toString.call(variable) === '[object Number]') {
// действия для числа
}
зная это, изменим решение Как найти сумму элементов массива - #2 от пользователя andy_gold так, чтобы суммировались только числа:
var arr = [3, 2, '999', 5, 6, [], {
lol: true
}];
function arraySum(array) {
var sum = 0;
for (var i = 0; i < array.length; i++) {
if (Object.prototype.toString.call(array[i]) === '[object Number]') {
sum += array[i];
}
}
return sum
}
console.log(arraySum(arr)) // 16
function arraySum(arr) {
return arr
.toString().split(’,’)
.map(el => parseFloat(el))
.filter(el => !Number.isNaN(el))
.reduce((acc, cur) => acc + cur);
}
Так не надо. Превращение массива данных в строку с преобразованием типов ради неясной выгоды вредно.
Если хочешь описать код так, чтобы суммировались только числовые элементы массива, то отфильтровать нечисловые значения можно в теле reduce
. Кода будет меньше и избавишься от неявного приведения типов.
В моем случае был многоуровневый массив.
Даже для многоуровневого так лучше не делать. Для многоуровневого нужно писать рекурсивную функцию.
И посмотри как такая реализация поведет себя со следующими аргументами:
arraySum([1, 2, 3, 4, '10 monkeys'])
спасибо очень помог
Здравствуйте, подскажите пожалуйста, как с помощью рекурсии получить сумму всех элементов массива? Спасибо!
Ответил в отдельной теме: Как рекурсивно найти сумму элементов массива. В целом не стесняйся создавать новые темы. Так удобнее держать обсуждения в рамках обсуждаемого вопроса.
function sumArray(a) {
let res = a.join(’+’);
return eval(res);
}
const summArr = (arr) => arr.reduce((acc, curr) => isNaN(Number(curr)) ? acc : acc + Number(curr), 0)
1е что приходит в голову это метод reduce