Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Функция, которая возвращает сумму всех чисел, переданных в качестве аргументов (https://javascript.ru/forum/misc/69902-funkciya-kotoraya-vozvrashhaet-summu-vsekh-chisel-peredannykh-v-kachestve-argumentov.html)

Tanya51 26.07.2017 09:32

Функция, которая возвращает сумму всех чисел, переданных в качестве аргументов
 
Задачка:
Напишите функцию, которая возвращает сумму всех чисел, переданных в качестве аргументов, число которых не ограничено. Функция работает только с числами (включая строковые). Если какой-то из параметров - массив, то к сумме добавляется также сумма значений этого массива (если какое-либо из значений этого массива также является массивом, то к результату добавляется также и сумма его значений, и так далее).

var sum = getSum(1, '1', 'one', [2, '2', 'two']);
console.log( sum ); // 6


мне надо,чтоб у меня вывелась сумму всех чисел,переданных через аргумент. Т.е. в данном случае должно быть 6. Но мне выводит 11(количество всех аргументов).

Мой JS
function getSum () {
	var result=0;

	for (var i = 0; i < arguments.length; i++) {


		if(arguments.length instanceof Array){

  			for (var i = 0; i < arguments.length; i++){

  				result +=(arguments[i]=(!isNaN(+arguments[i]))?+arguments[i]:0);}

  			}else if(!isNaN(+arguments[i])){

					result +=arguments[i];

  			}else{

				continue;

  			}

	};

	return result;
};

var sum = getSum(1, '1', 'one', [2, '2', 'two']);
console.log( sum ); // 6


Помогите разобраться пожалуйста.


А еще как можно реализовать вот это "если какое-либо из значений этого массива также является массивом, то к результату добавляется также и сумма его значений, и так далее"?

nerv_ 26.07.2017 10:34

классика :)
function sum(...args) {
  const [head,...tail] = args
  if (Array.isArray(head)) {
    return sum(...head.concat(tail))
  } else {
    return tail.length > 0
      ? sum(...tail) + Number(head)
      : Number(head)
  }
}


alert(sum(1,2,3,['4',[5,'6',[7]]])) // 28


p.s.: кейсы вида 'one' не обрабатывал

UPD: обновил имена переменных в соответствии с терминологией рекурсивного программирования

Dilettante_Pro 26.07.2017 11:23

Tanya51,
Немного исправленный ваш код

function getSum () {
	var result=0;

	for (var i = 0; i < arguments.length; i++) {


		if(arguments[i] instanceof Array){

  			for (var j = 0; j < arguments[i].length; j++){

  				result +=(arguments[i][j]=(!isNaN(+arguments[i][j]))?+arguments[i][j]:0);
                        }

  		}else if(!isNaN(+arguments[i])){

					result += +arguments[i];

  			}else{

				continue;

  			}
               
	};

	return result;
};

var sum = getSum(1, '1', 'one', [2, '2', 'two']);
alert( sum ); //
6

Tanya51 26.07.2017 11:52

спасибо

Dilettante_Pro 26.07.2017 13:13

Tanya51,
ваш код в рекурсивном виде
function getSum () {
	var result=0;

	for (var i = 0; i < arguments.length; i++) {


		if(arguments[i] instanceof Array){

  			for (var j = 0; j < arguments[i].length; j++){

  				result += getSum (arguments[i][j]);

                        }

  		}else if(!isNaN(+arguments[i])){

					result += +arguments[i];

  			}else{

				continue;

  			}
               
	};

	return result;
};

var sum = getSum(1, '1', 'one', [2,[ '2', 'two']]);
alert( sum ); //


Часовой пояс GMT +3, время: 18:11.