2013-10-03 4 views
0

В настоящее время я работаю над упражнением javascript от http://toys.usvsth3m.com/javascript-under-pressure/, а мой код не работает на вложенных массивах ... Я пытаюсь использовать рекурсию для решения проблемы, но это только похоже, добавляет первый элемент в ситуацию с вложенным массивом ... Я исхожу из фона Ruby, поэтому javascript мне незнакомо.Только нахождение первого числа в вложенном массиве

Если кто-нибудь может указать, что я делаю неправильно, я был бы признателен!

Спасибо, Смитти

function arraySum(i) { 

// i will be an array, containing integers and/or arrays like itself. 
// Sum all the integers you find, anywhere in the nest of arrays. 
var sum = 0; 
sum = sumit(i); 

return sum; 
} 

function sumit(i) { 
var sum = 0; 
for (a=0; a<i.length; a++) 
{ 
    if (typeof(i[a]) == 'array') 
    { 
     sumit(i[a]); 
    } 
    else 
    { 
    sum += parseInt(i[a]); 
    } 
} 
return sum; 
} 
+1

Несомненно, вы хотите делать 'sum + = sumit (i [a]); 'внутри оператора' if'? –

+0

, чтобы сделать его действительно легким, я бы сгладил массив, а затем суммировал его. – dandavis

ответ

0

Вы не используете значение вашего рекурсивного вызова. Попытка:

if (typeof(i[a]) === 'object') 
{ 
    sum += sumit(i[a]); 
} 
+0

'typeof [] ===" object "', NOT '" array "'. –

+0

Хороший улов, мой плохой. Отредактировано для исправления ошибки. – tlrobrn

+0

Теперь это вызывает странное поведение, когда задано '['123"] 'как вход. Ожидаемый результат - 123, но фактический вывод будет 6. –

0

Давайте посмотрим на ваш код.

  • инициализацию sum переменную 0
  • Обратитесь к функции «помощник» на входном массиве, и присвоить возвращаемое значение sum
    • вашей функции «хелпера» инициализирует другой переменной, которая происходит также sum до нуля - однако важно отметить, что это не одна и та же переменная. Для ясности я буду называть его sum2.
    • Для каждого элемента в массиве ...
      • Если это тип массива, вызов функции помощника на этом массиве, но ничего не делать с возвращаемым значением - ОШИБКА: Массивы возвращают их тип как «объект».
      • В противном случае, приведение его в целое число и добавить его в sum2
    • Вернуться sum2
  • Вернуться sum

Глядя на этот код, нет никакой причины, почему она не должна работа для массивов целых чисел. Однако для подмассивов вы полностью отбрасываете результат ... если вы определяете его как массив, которого вы не являетесь. Вместо этого он также бросается. Кроме того, нет смысла иметь отдельную функцию, поскольку все, что вы делаете в своей «основной» функции, вызывает ее и возвращает возвращаемое значение.

попробовать что-то вроде этого:

function sum(arr) { 
    function recurse(total,curr) { 
     if(curr.constructor === Array) return total+sum(curr); 
     return total+parseInt(curr,10); 
    } 
    if(arr.reduce) return arr.reduce(recurse,0); 
    // fallback for older browsers that don't support "reduce" 
    for(var i=0, l=arr.length, total=0; i<l; i++) total = recurse(total,curr); 
    return total; 
} 

Альтернативное решение, непроверенных в пожилом IE, но должно быть хорошо предполагая браузер reasonbly уточненный:

function sum(arr) { 
    arr = arr.concat.apply([],arr); // flatten the array 
    for(var i=0, l=arr.length, total=0; i<l; i++) total += parseInt(arr[i],10); 
    return total; 
} 
0

Есть три вещи, которые не правы.

Вот исправление с объяснением в комментариях:

function sumit(i) { 
var sum = 0; 
//You need to declare a, or else it puts it in the global scope. 
var a; 
for (a=0; a<i.length; a++) { //as a stylistic point, don't put { on a new line. 
    //check for array by seeing if it has a length property 
    if (i[a].length !== undefined) { 
     //add to sum 
     sum+= sumit(i[a]); 
    } 
    else { 
     sum += parseInt(i[a]); 
    } 
} 
return sum; 
} 

Во-первых, при использовании for(a = 0; . . . декларация в глобальном масштабе.

Во-вторых, проверка TYPEOF на массив не всегда будет работать, но все массивы будут иметь .Length

В-третьих, так как tlrobrn указал, что вам нужно продолжать добавлять к «сумме».

ПРИМЕЧАНИЕ: Я проверил это решение в узле с этими вызовами

var ar = [1,1,[1,1,1,1,1],1,1,1]; 
console.log(sumit(ar)); //should print 10 

относительно проверки массивов: Check if object is array?

+0

Исключительно, что произойдет, если я вызову вашу функцию с помощью [[1,1, {length: 99999999999, taunt: "LOLUFAIL"}, 1,1] '? ;) –

+0

хороший звонок :) Я согласен, что это может случиться, это был мой первый инстикт для проверки массива –

0

мой код был короче в моем тесте, проверить его

function arraySum(i) { 

var sum = 0 ; 

for (var a in i) { 
    if (typeof i[a] === 'object') { // if it is an array or object, typeof will return 'object' 
     return sum + arraySum (i[a]) ; // recursive call 
    } else if (typeof i[a] === 'number') { // if it is a number, just sum it 
     sum = sum + i[a] 
    } 
} 

return sum; 

}

Смежные вопросы