Biorąc pod uwagę tablicę [1, 2, 3, 4]
, jak mogę znaleźć sumę jej elementów? (W tym przypadku suma byłaby 10
.)
Myślałem, że $.each
może się przydać, ale nie jestem pewien, jak to zaimplementować.
javascript
jquery
arrays
akano1
źródło
źródło
a[0] + a[1] + ...
, co może przekształcić się w konkatenację łańcuchów, jeśli tablica zawiera elementy nieliczbowe. Np['foo', 42].reduce((a,b)=>a+b, 0) === "0foo42"
.[1,2,3].reduce(Math.sum)
.Odpowiedzi:
Zalecane (zmniejsz z wartością domyślną)
Array.prototype.reduce można wykorzystać do iteracji w tablicy, dodając bieżącą wartość elementu do sumy poprzednich wartości elementu.
Bez wartości domyślnej
Otrzymujesz TypeError
Przed funkcjami strzałek ES6
Dane nienumeryczne
Jeśli możliwe są dane nieparzyste, możesz sobie z tym poradzić?
Non-zalecany niebezpieczne użycie eval
Możemy użyć eval do wykonania ciągu reprezentującego kod JavaScript. Używając funkcji Array.prototype.join do konwersji tablicy na ciąg, zmieniamy [1,2,3] na „1 + 2 + 3”, co daje w wyniku wartość 6.
Oczywiście wyświetlanie ostrzeżenia nie jest najgorszą rzeczą, jaka może się zdarzyć. Jedynym powodem, dla którego podałem to pytanie, jest odpowiedź na pytanie Ortunda, ponieważ nie sądzę, aby zostało wyjaśnione.
źródło
reduce()
jest nadal o 25-30% wolniejsza niż prosta indeksowanafor()
pętla po wielu latach? jsperf.com/reduce-vs-loop/4W Lisp to byłaby właśnie praca
reduce
. Zobaczysz ten rodzaj kodu:Na szczęście w JavaScript też mamy
reduce
! Niestety+
jest operatorem, a nie funkcją. Ale możemy zrobić to ładnie! Tutaj spójrz:Czy to nie jest ładne? :-)
Nawet lepiej! Jeśli używasz ECMAScript 2015 (alias ECMAScript 6 ), może to być całkiem ładne:
źródło
[1, 2, 3].reduce((a,b)=>a+b)
Array.prototype.sum = function() { return this.reduce((a,b) => a+b, 0); }
Array.prototype.avg = function() { return this.reduce((a,b) => a+b, 0)/this.length; }
Dlaczego nie zmniejszyć? Zwykle jest to nieco sprzeczne z intuicją, ale użycie go do znalezienia kwoty jest dość proste:
źródło
reduce()
?Array.prototype.reduce()
redukuje tablicę do pojedynczej wartości zwracanej.źródło
(var i=0; i<arr.length; i++)
jest jeszcze szybsze. I nawet wtedy używanievar sum=0; var i=arr.length; while(i--) sum += arr[i]
jest jeszcze szybsze.for... in
pętli na tablicach działa w tym przypadku _ przypadkowo_ i ponieważ tablice rozszerzają obiekty. Rozwiązanie Rikinga jest lepszefor...in
Pętla w JavaScript bierze indeksy, co jest częstą przeszkodą dla programistów, którzy oczekują, aby uzyskać wartości. (Spróbujfor(var i in [1,2,3]) { console.log(i); }
w konsoli.)źródło
reduce
poniższej odpowiedzi ; nie deklaruj zmiennych zmiennych, gdy ich nie masz.Jeśli używasz Lodash, możesz użyć funkcji sumowania
źródło
Jest to możliwe, zapętlając wszystkie elementy i dodając je przy każdej iteracji do
sum
zmiennej.JavaScript nie zna zakresu bloków, więc
sum
będzie dostępny:To samo co powyżej, ale opatrzone adnotacjami i przygotowane jako prosta funkcja:
źródło
sum
poza pętlą jest znacznie bardziej czytelny.const
ilet
. Możesz więc zadeklarowaćsum
pozafor
pętlą jakolet sum = 0;
. Możesz także buforować długość tablicy przed pętlą jakoconst length = array.length;
Odwołanie: Array.prototype.reduce ()
źródło
arr
jest[]
.arr.reduce(function (a, b) { return a + b; }, 0);
Zajmie to średnio 1,57 ms / przebieg (mierzone ponad 1000 przebiegów na tablicy 100 losowych liczb normalnych), w porównaniu do 3,604 ms / przebieg przy
eval()
zastosowaniu powyższej metody i 2,151 ms / przebieg ze standardem dla (i, długość, ++ ).Uwaga dotycząca metodologii: ten test został przeprowadzony na serwerze Google Apps Script, więc ich silniki javascript są prawie takie same jak Chrome.
EDYCJA:
--i
zamiasti--
zapisuje 0,12 ms przy każdym uruchomieniu (i-- wynosi 1,7)EDYCJA: Święty przekleństwo, nie wspominając o tym całym poście. Użyj wyżej wspomnianej metody redukcji (), to tylko 1 ms / przebieg.
źródło
while (--i) do_something
może to działać również w przypadku innych rzeczy.var sum = arr[0]
Możesz także użyć funkcji zmniejszania prawa.
co daje wynik jako 21.
Odniesienie: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight
źródło
Ktoś szuka funkcjonalnego onelinera takiego jak ja? Weź to:
źródło
arr.reduce(function(a, b) { return a + b;}, 0);
Zabawne podejście:
źródło
reduce
jest zdecydowanie lepsze w większości, jeśli nie we wszystkich przypadkach.[1,"2;YourProgram.ripToShreds();3",4]
NaN
gdy próbujęeval(['alert("removing your computer")',2,3].join("+"))
złą odpowiedź 0/10OK, wyobraź sobie, że masz tę tablicę poniżej:
Zacznijmy szukać na wiele różnych sposobów aby to zrobić, ponieważ nie mogłem znaleźć tutaj wyczerpującej odpowiedzi:
1) Korzystanie z wbudowanej funkcji zmniejszania ()
2) Korzystanie z pętli for
3) Używanie pętli while
4) Korzystanie z tablicy forEach
i nazwij to tak:
Nie zaleca się prototypowania czegoś takiego do Array ...
źródło
Standardowe rozwiązanie JavaScript:
To działa dla mnie (wynik powinien wynosić 5). Mam nadzieję, że w tego rodzaju rozwiązaniu nie ma ukrytej wady.
źródło
W ten sposób możesz umieścić w tablicy wszystkie egzotyczne rzeczy.
Żartuję tylko do połowy.
źródło
eval(['alert("removing your computer")',2,3].join("+"))
Jestem początkującym w JavaScript i kodowaniu, ale odkryłem, że prosty i łatwy sposób sumowania liczb w tablicy wygląda następująco:
Zasadniczo chciałem się do tego przyczynić, ponieważ nie widziałem wielu rozwiązań, które nie używają wbudowanych funkcji, a ta metoda jest łatwa do napisania i zrozumienia.
źródło
Krótki fragment kodu JavaScript wykona tę pracę:
źródło
Kilka osób zasugerowało dodanie
.sum()
metody doArray.prototype
. Jest to ogólnie uważane za złą praktykę, więc nie sugeruję, abyś to zrobił.Jeśli nadal nalegasz na zrobienie tego, to jest to zwięzły sposób napisania:
następnie:
[1,2].sum(); // 3
Zauważ, że funkcja dodana do prototypu używa kombinacji funkcji ES5 i ES6 oraz składni strzałek.
function
Jest uznana metoda pozwoli uzyskaćthis
kontekst przeprowadzonąArray
że jesteś działających na. Użyłem=>
zwięzłości w trakciereduce
rozmowy.źródło
Użyj
for
pętli:Lub nawet
forEach
pętlę:Dla uproszczenia użyj
reduce
:źródło
Nie musisz
initial value
! Ponieważ jeśli nieinitial value
zostanie przekazane,callback function
nie zostanie wywołane na pierwszym elemencie listy, a pierwszy element zostanie przekazany jakoinitial value
. Very c OO l funkcja :)źródło
Oto eleganckie jedno-liniowe rozwiązanie wykorzystujące algorytm stosu , choć zrozumienie piękna tej implementacji może trochę potrwać.
Zasadniczo funkcja przyjmuje tablicę i sprawdza, czy tablica zawiera dokładnie jeden element. Jeśli false, wyskakuje ostatni element ze stosu i zwraca zaktualizowaną tablicę.
Piękno tego fragmentu polega na tym, że funkcja obejmuje
arr[0]
sprawdzanie, aby zapobiec nieskończonemu zapętleniu. Gdy osiągnie ostatni element, zwraca całą sumę.źródło
Możesz połączyć metodę redukcyjną () z wyrażeniem lambda:
źródło
Posługiwać się
reduce
źródło
widziałem wszystkie odpowiedzi dotyczące rozwiązania „zmniejszającego”
źródło
Precyzja
Sortuj tablicę i sumę początkową od najmniejszych liczb (fragment pokazuje różnicę w przypadku braku sortowania)
Pokaż fragment kodu
Do wielowymiarowej tablicy liczb użyj
arr.flat(Infinity)
Pokaż fragment kodu
źródło
Fajne sztuczki tutaj, mam niezły wybór z wieloma bezpiecznymi tradycyjnymi odpowiedziami, które nie buforują długości tablicy.
Bez buforowania długości tablicy kompilator JS musi przechodzić przez tablicę przy każdej iteracji pętli, aby obliczyć długość, w większości przypadków jest to niepotrzebne obciążenie. V8 i wiele współczesnych przeglądarek optymalizuje to dla nas, więc nie było to tak ważne, ale istnieją starsze urządzenia, które korzystają z tego prostego buforowania.
Jeśli długość może ulec zmianie, buforowanie może spowodować nieoczekiwane skutki uboczne, jeśli nie wiesz, dlaczego buforujesz długość, ale dla funkcji wielokrotnego użytku, której jedynym celem jest wzięcie tablicy i dodanie wartości razem, jest to świetne dopasowanie.
Oto link CodePen dla tej funkcji arraySum. http://codepen.io/brandonbrule/pen/ZGEJyV
Możliwe, że jest to przestarzały sposób myślenia, który utkwił we mnie, ale nie widzę wady korzystania z niego w tym kontekście.
źródło
To są naprawdę świetne odpowiedzi, ale na wszelki wypadek, jeśli liczby są po kolei, jak w pytaniu (1,2,3,4), możesz to łatwo zrobić, stosując wzór (n * (n + 1)) / 2 gdzie n jest ostatnią liczbą
źródło
źródło
To jest o wiele łatwiejsze
źródło
Prosty przykład metody:
źródło