2013-04-17 13 views
46

Mam zdefiniowane javascript zmiennych zwanych myData co jest new Array tak:wartości Sum z tablicy w JavaScript

var myData = new Array(['2013-01-22', 0], ['2013-01-29', 0], ['2013-02-05', 0], 
      ['2013-02-12', 0], ['2013-02-19', 0], ['2013-02-26', 0], 
      ['2013-03-05', 0], ['2013-03-12', 0], ['2013-03-19', 0], 
      ['2013-03-26', 0], ['2013-04-02', 21], ['2013-04-09', 2]); 

Zastanawiam się, czy jest możliwe, aby podsumować znalezione w tablicy wartości liczbowych (ex 0 + 0 + 21 + 2 + 0 i tak dalej) i prawdopodobnie zmienna z wynikiem, którego mogę użyć poza znacznikiem skryptu, ponieważ mam 7 takich tablic odpowiadających każdemu z dni tygodnia. Chcę na tej podstawie dokonać porównania. To jest najbardziej preferowana metoda dla tego rodzaju działań, jeśli jest to możliwe?

+0

iteracyjnego tablicy i dodać drugi element z wewnętrznych tablic. –

Odpowiedz

18

Wypróbuj następujące

var myData = [['2013-01-22', 0], ['2013-01-29', 1], ['2013-02-05', 21]]; 
 

 
var myTotal = 0; // Variable to hold your total 
 

 
for(var i = 0, len = myData.length; i < len; i++) { 
 
    myTotal += myData[i][1]; // Iterate over your first array and then grab the second element add the values up 
 
} 
 

 
document.write(myTotal); // 22 in this instance

+0

Myślę, że chodziło o 'myData [i] [1]'. I dlaczego warto używać 'parseFloat', jeśli wartość jest już liczbą? –

+0

to wyjście 24156 zamiast jak powinno 3. Przetestowałem z "pustą tablicą wartości" i otrzymuję to samo wyjście ... –

+0

@FelixKling działa z 'myData [i] [1]' ale jak robię myTotal dostępny w innym znaczniku skryptu? –

90

Można użyć metody Array.reduce:

var sum = myData.reduce(
      function(sum, current){ 
      return sum + current[1]; 
      }, 0 
     ); 

Zobacz MDN

+0

To powinno być 'prev [1]' Chyba. W każdym razie wynik nie da "23". – VisioN

+4

@Kooilnc Należy pamiętać, że 'Array.reduce' jest dodatkiem ECMAscript 5, więc nie będę obsługiwane przez wszystkie przeglądarki - patrz tutaj https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/ Array/Reduce, który zawiera również kod, który można zaimplementować w celu obejścia tego –

+1

@VisioN: zapomniałem wartości początkowej, dodano ją. I nie, nie powinno to być 'prev [1]' @MarkWalters: tak, ale można użyć podkładki z łącza MDN (patrz odpowiedź) – KooiInc

12

użyłbym reduce

var myData = new Array(['2013-01-22', 0], ['2013-01-29', 0], ['2013-02-05', 0], ['2013-02-12', 0], ['2013-02-19', 0], ['2013-02-26', 0], ['2013-03-05', 0], ['2013-03-12', 0], ['2013-03-19', 0], ['2013-03-26', 0], ['2013-04-02', 21], ['2013-04-09', 2]); 

var sum = myData.reduce(function(a, b) { 
    return a + b[1]; 
}, 0); 

$("#result").text(sum); 

Dostępne na jsfiddle

0

javascript wbudowaną zmniejszyć dla tablic nie jest standardem, ale można użyć underscore.js:

var data = _.range(10); 
var sum = _(data).reduce(function(memo, i) {return memo + i}); 

która staje

var sumMyData = _(myData).reduce(function(memo, i) {return memo + i[1]}, 0); 

dla twojej sprawy. Spójrz na to także fiddle.

2

Jeśli chcesz usunąć tablicę w tym samym czasie co sumowania, można zrobić (powiedzmy, stack jest tablica):

var stack = [1,2,3], 
    sum = 0; 
while(stack.length > 0) { sum += stack.pop() }; 
11

Tworzenie metody sumy będzie działać dobrze, na przykład można dodać funkcję suma Array

Array.prototype.sum = function(selector) { 
    if (typeof selector !== 'function') { 
     selector = function(item) { 
      return item; 
     } 
    } 
    var sum = 0; 
    for (var i = 0; i < this.length; i++) { 
     sum += parseFloat(selector(this[i])); 
    } 
    return sum; 
}; 

następnie można zrobić

> [1,2,3].sum() 
6 

iw Twoim przypadku

> myData.sum(function(item) { return item[1]; }); 
23 

Edit: Przedłużanie przy pomocy poleceń wbudowanych może być mile widziana, ponieważ gdyby każdy robił sprawimy, że rzeczy niespodziewanie będą nadpisywać się nawzajem (zderzenia nazw). możesz dodać funkcję sumującą do jakiegoś modułu i zaakceptować tablicę jako argument, jeśli chcesz. że może oznaczać zmianę podpis myModule.sum = function(arr, selector) { następnie this staną arr

53

Myślę, że najprostszym sposobem może być:

values.reduce(function(a, b){return a+b;}) 
+6

To powinno być zaakceptowaną odpowiedzią na ogólne pytanie, ale plakat miał strukturę danych, która niestety nie działałaby z tym problemem. Jest to dokładnie najlepszy sposób na obsłużenie szeregu liczb, jednak – netpoetica

+1

Zapewnienie, że są to liczby, nie zaszkodzi: values.reduce (function (a, b) {return + a + + b;}) –

+1

@netpoetica 'myData.map (function (o) {return o [1];}). reduce (a, b) {return a + b; }) ' –

1

Można użyć natywną metodę map dla tablic. map Method (Array) (JavaScript)

var myData = new Array(['2013-01-22', 0], ['2013-01-29', 0], ['2013-02-05', 0], 
      ['2013-02-12', 0], ['2013-02-19', 0], ['2013-02-26', 0], 
      ['2013-03-05', 0], ['2013-03-12', 0], ['2013-03-19', 0], 
      ['2013-03-26', 0], ['2013-04-02', 21], ['2013-04-09', 2]); 
var a = 0; 
myData.map(function(aa){ a += aa[1]; return a; }); 

a jest Twój wynik

5

Albo w ES6

values.reduce((a, b) => a + b),

przykład:

[1,2,3].reduce((a, b)=>a+b) // return 6 
0

Stary sposób (jeśli nie teraz długość argumenty/parametry)

>> function sumla1(){ 

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

     result+=arguments[i]; 

    } 
    return result; 
    } 
    >> sumla1(45,67,88); 
    >> 200 

ES6 (rozpad matrycy)

>> function sumla2(...x){return x.reduce((a,b)=>a+b)} 
>> 
>> sumla2(5,5,6,7,8) 
>> 
>> 31 
>> 
>> var numbers = [4, 9, 16, 25]; 
>> sumla2(...numbers); 
>> 54 
Powiązane problemy