2015-06-30 2 views
0

Я пытаюсь написать функцию, которая будет извлекать и суммировать все целые числа, независимо от того, сколько уровней (я говорю многомерные массивы здесь) из заданного массива. Вот что у меня до сих пор:Извлечение и добавление номеров из массива

function addTheNumbers (someArray) { 
    var onlyNumbers = someArray.filter(function(a){ return typeof(a)=='number'; }); 
    for (i = 0; i < onlyNumbers.length; i++) { 
     // idk 
    } 
} 
var sampleArray = ['word',['a','b','c'],12314,'longer phrase',5,[123,123,2],10,3874,32]; 
addTheNumbers(sampleArray); 

У меня есть две проблемы:

1) Я чувствую, как фильтр у меня на месте будет только извлечь номера, которые стоят в одиночку в данный массив, а не ВСЕ числа во всех массивах ... не знаете, как это исправить.

2) Я знаю, что как только у меня будут извлечены все числа, они будут сохранены в объекте/массиве, и мне придется перебирать его каким-то образом, чтобы добавить их все вместе, но ... еще раз я понятия не имею, как действовать дальше.

JSFiddle, чтобы облегчить ситуацию.

+4

Если элемент массива, применить addTheNumbers рекурсивно на нем. –

+0

Ваша проблема может быть описана как две более мелкие проблемы: 1) сгладить массив, 2) суммировать элементы (если они являются числами). –

+0

'typeof' работает без скобок. –

ответ

1

Попробуйте это.

var temp = []; 
 
function addTheNumbers(someArray) { 
 

 
\t for (var i = 0; i < someArray.length; i++) { 
 
\t \t \t if(typeof someArray[i] == "number") 
 
\t \t \t temp.push(someArray[i]); 
 
\t \t else if(typeof someArray[i] == "object"){ 
 
\t \t \t addTheNumbers(someArray[i]); 
 
\t \t } 
 
\t }; 
 
} 
 

 

 
var sampleArray = ['word', ['a', 'b', 'c'], 12314, 'longer phrase', 5, [123, 123, 2], 10, 3874, 32]; 
 
addTheNumbers(sampleArray);

+0

Это возвращает «undefined» для меня. :/ –

+0

Вы получите значения в переменной «temp» – Gagan

+0

Хорошо, поэтому я понимаю, что 'someArray' получает« отсканированный »для типа номера, а значения подталкиваются к переменной temp, но где мы добавляем эти значения вместе в этом? –

0

Как говорили другие ответы, тем легче путь является рекурсивной структурой.

function addTheNumbers(arr) { 
 
    return arr.reduce(function (sum, currentValue) { 
 
     if (currentValue instanceof Array) { 
 
      return sum + addTheNumbers(currentValue); 
 
     } 
 
     return sum + (typeof currentValue == "number" ? currentValue : 0); 
 
    }, 0); 
 
} 
 
var sampleArray = ['word',['a','b','c'],12314,'longer phrase',5,[123,123,2],10,3874,32]; 
 
alert(addTheNumbers(sampleArray)); // returns 16483

+0

Я получаю все, кроме строки 6, в частности, часть '? B: 0'. Могли бы вы пройти через меня? –

+0

Это [тройной оператор] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator) ... (условие? TRUE: FALSE) – w35l3y

0
var number = []; 
    function addTheNumbers(someArray) { 

     for (var i = 0; i < someArray.length; i++) { 
     if(/^-?\d+\.?\d*$/.test(someArray[i])) { 
     number.push(someArray[i]); 
    }  
    else if(someArray[i] !== null && typeof someArray[i] === 'object'){ 
       addTheNumbers(someArray[i]); 
      } 
     }; 
    } 


    var sampleArray = ['word', ['a', 'b', 'c'], 12314, 'longer phrase', 5, [123, 123, 2], 10, 3874, 32]; 
addTheNumbers(sampleArray); 

надеюсь, что это поможет;)

0

r() является обратный вызов для уменьшения массива.

var sampleArray = ['word', ['a', 'b', 'c'], 12314, 'longer phrase', 5, [123, [123, 0], 2], 10, 3874, 32]; 
 
function r(res, el) { 
 
    if (typeof el === 'number') { 
 
     res.push(el); 
 
    } else if (Array.isArray(el)) { 
 
     res = res.concat(el.reduce(r, [])); 
 
    } 
 
    return res; 
 
} 
 
document.write('<pre>' + JSON.stringify(sampleArray.reduce(r, []), null, 4) + '</pre>');

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