zbysiusp
15.07.2016, 07:32:10
Witam!
Proszę o pomoc w sumowaniu elementów tablicy w JS jQuery. Tworzę dynamicznie tablicę array z pliku JSON, która ma 3 elementy: index, element.A, element.B. Wartość A i B pobierana jest z pliku JSON. Tablica jest dynamiczna tzn. co sekundę dopisywany jest nowy "rekord" aż do 142, a następnie najstarszy z niej wypada. Tak więc w danej sekundzie "rekordów" jest zawsze 142. Chciałbym na bieżąco liczyć i wyświetlać w konsoli sumę wartość pola element.B wszystkich 142 rekordów. Napisałem taki kod, ale nie działa:
Kod
<script type="text/javascript">
$(function demo()
{
$.ajax({
type: 'GET',
url: 'demo.php',
dataType: 'json',
success: function (data){
$.each(data, function(index, element) {
var array = [index, element.A, element.B];
/* Chciałbym liczyć sumę kolejnych wartości pola element.B */
$.each(array,function(){sum+=parseFloat(element.B) || 0;});
/* I wyświetlać sumę w konsoli */
console.log(sum);
});
}
});
setTimeout(demo, 1000);
});
</script>
Pozdrawiam
zbysiusp
trueblue
15.07.2016, 09:05:21
zbysiusp
15.07.2016, 09:29:36
Dziękuję za link, ale problem jest chyba inny:
Tablica wygląda tak:
[index, data, wartosc]
[1, 2016-07-15 10:26, 100]
po sekundzie
[2, 2016-07-15 10:27, 200]
po sekundzie
[3, 2016-07-15 10:28, 300]
po sekundzie
...
Chcę w zmiennej sum uzyskać wartość: 100+200+300 (zlicznie "w pionie").
trueblue
15.07.2016, 09:36:14
Najpierw musisz zaimplementować kolejkę FIFO i wrzucać do niej co sekundę elementy.
Dopiero potem możesz zająć się liczeniem sumy jak w przykładzie, który podałem, chyba, że struktura będzie inna - choć nie sądzę.
phpion
15.07.2016, 09:52:09
Zamiast liczyć sumę za każdym razem modyfikuj ją: w momencie dopisywania wiersza dodawaj jego wartość, w momencie usuwania wiersza odejmuj jego wartość.
zbysiusp
15.07.2016, 10:00:33
Zaczynam dopiero z JS. Doradź proszę jak zmienić kod (implementacja kolejki), który podałem w pierwszym poście. Pokazuje kolejne rekordy dopisywane w terminalu tylko sumy brak.
Cytat(phpion @ 15.07.2016, 10:52:09 )

Zamiast liczyć sumę za każdym razem modyfikuj ją: w momencie dopisywania wiersza dodawaj jego wartość, w momencie usuwania wiersza odejmuj jego wartość.
Jak to zapisać w kodzie? Podaj proszę przykład.
trueblue
15.07.2016, 10:22:30
http://stackoverflow.com/a/4774081/5889778Dodaj do kodu podaną tam również funkcję sum.
var fifo=new createRingBuffer(142);
fifo.push(1);
console.log(fifo.sum());
fifo.push(2);
console.log(fifo.sum());
zbysiusp
15.07.2016, 10:48:17
Elementy są już wrzucane do tablicy co sekundę.
Kod
$.each(data, function(index, element) {
Chcę tylko sumować jedną kolumnę w pętli na zasadzie:
1. var sum=0
2. sum = sum+element.B
3. console.log(sum)
trueblue
15.07.2016, 10:57:34
Kod poniższy nie ma związku z wrzucaniem elementów do tablicy, służy on iteracji na tablicy.
Z tego co piszesz (post #3) co sekundę otrzymujesz paczkę danych, która nie jest tablicą, lecz pojedynczym obiektem.
zbysiusp
15.07.2016, 11:02:43
Cytat(trueblue @ 15.07.2016, 11:57:34 )

Kod poniższy nie ma związku z wrzucaniem elementów do tablicy, służy on iteracji na tablicy.
Z tego co piszesz (post #3) co sekundę otrzymujesz paczkę danych, która nie jest tablicą, lecz pojedynczym obiektem.
Dokładnie tak. Tablicę tworzę ja bo sądziłem, że po każdej sekundowej paczce danych pozostanie wartość, którą zsumuję z wartością z następnej paczki itd. Czy to oznacza, że sumowanie danych ze 142 kolejnych paczek jest niemożliwe?
trueblue
15.07.2016, 11:07:07
Jest możliwe, ale fragment kodu, który podałeś jest niepotrzebny.
Funkcja success zwraca zmienną data, która jest sparsowaną odpowiedzią JSON (zakładam, że to zwracasz w PHP). Otrzymujesz więc obiekt JS.
Tak więc zależnie od tego jak wygląda dokładnie zmienna data, pobierasz z jej indeksu wartość do sumy i sumujesz.
Tyle, że musisz zadbać o to, aby przy 142-gim elemencie odjąć od sumy wypadający element (rozwiązanie phpion) lub skorzystać z kolejki (rozwiązanie, które podałem).
zbysiusp
15.07.2016, 11:33:46
Cytat(trueblue @ 15.07.2016, 12:07:07 )

Jest możliwe, ale fragment kodu, który podałeś jest niepotrzebny.
Funkcja success zwraca zmienną data, która jest sparsowaną odpowiedzią JSON (zakładam, że to zwracasz w PHP). Otrzymujesz więc obiekt JS.
Tak więc zależnie od tego jak wygląda dokładnie zmienna data, pobierasz z jej indeksu wartość do sumy i sumujesz.
Tyle, że musisz zadbać o to, aby przy 142-gim elemencie odjąć od sumy wypadający element (rozwiązanie phpion) lub skorzystać z kolejki (rozwiązanie, które podałem).
console.log(data)Co z tym zrobić dalej?
trueblue
15.07.2016, 11:36:31
To jest wartość zmiennej data otrzymanej przy jednokrotnym wywołaniu żądania Ajax, czyli to co otrzymujesz w jednej sekundzie?
Tam jest 100 obiektów, nie 1.
zbysiusp
15.07.2016, 11:41:44
Cytat(trueblue @ 15.07.2016, 12:36:31 )

To jest wartość zmiennej data otrzymanej przy jednokrotnym wywołaniu żądania Ajax, czyli to co otrzymujesz w jednej sekundzie?
Tam jest 100 obiektów, nie 1.
Dokładnie tak!
Wywołanie jednorazowe:
Kod
$.each(data, function(index, element) {}
Tylko co sekundę zmienia się zawartość tej paczki o jedną wartość.
Dane pochodzą z pliku JSON:
JSON źródło
trueblue
15.07.2016, 11:52:26
zbysiusp
15.07.2016, 12:09:55
Cytat(trueblue @ 15.07.2016, 12:52:26 )

Bardzo dziękuję! Jesteś Wielki! O to chodziło. Działa świetnie.
KLIKAM POMÓGŁ!
Pozwolę sobie zapytać Cię o jeszcze jedną rzecz bo znasz moją strukturę data. Czy jest możliwość uzyskania na bieżąco maksymalnej i minimalnej wartości rainfall_10 z danej paczki: (console.log(max), console.log(min)?
trueblue
15.07.2016, 12:14:12
zbysiusp
15.07.2016, 12:23:23
BARDZO DZIĘKUJĘ!
Czy można kliknąć wiele razy pomógł?
Do pełni szczęścia JS-owego brakuje mi ostatniej rzeczy. Chciałbym aby obok wartości min i max ukazała się data (przekazana w tej samej paczce), przy której te wartości odnotowano. Czy jest to możliwe?
trueblue
15.07.2016, 12:27:10
zbysiusp
15.07.2016, 12:34:46
Cytat(trueblue @ 15.07.2016, 13:27:10 )

Rozumiem, że trzeba zrobić tablicę z dwoma powiązanymi elementami: data, wartość? Nie jest więc możliwe odczytanie innego parametru obiektu np. data, id po znalezieniu w nim maksymalnej wartości?
trueblue
15.07.2016, 12:38:38
Cytat(zbysiusp @ 15.07.2016, 13:34:46 )

Rozumiem, że trzeba zrobić tablicę z dwoma powiązanymi elementami: data, wartość? Nie jest więc możliwe odczytanie innego parametru obiektu np. data, id po znalezieniu w nim maksymalnej wartości?
Przecież tą tablicą jest
data.
https://jsfiddle.net/hre3nu9m/2/https://jsfiddle.net/hre3nu9m/3/
zbysiusp
15.07.2016, 13:10:57
Cytat(trueblue @ 15.07.2016, 13:38:38 )

W jaki jednak sposób można wyłuskać datę (czas_datetime) przypisaną do maksymalnej lub minimalnej wartości (rainfall_10)?
np. console.log(min, data_min)
JSONCytat(trueblue @ 15.07.2016, 13:38:38 )

Dziękuję bardzo. Działa dobrze. Nie mogę jednak uchwycić dat i wpisać ich do <div> podobnie jak to czynię z wartościami. Może trzeba to wykonać inaczej?
Kod
$("#max_data").html(maxEl);
nie działa
Kod
$("#suma").html(max);
działa
trueblue
15.07.2016, 13:35:25
max i min występują tu właściwie jako zmienne pomocnicze, choć można z nich skorzystać.
Pełne dane są w minEl oraz maxEl.
Zobacz co jest w nich przechowywane (console.log(minEl));
zbysiusp
15.07.2016, 13:42:51
Cytat(trueblue @ 15.07.2016, 14:35:25 )

max i min występują tu właściwie jako zmienne pomocnicze, choć można z nich skorzystać.
Pełne dane są w minEl oraz maxEl.
Zobacz co jest w nich przechowywane (console.log(minEl));
obiektTrzeba je tylko "wyciągnąć" i przekazać do <div>, ale jak?
trueblue
15.07.2016, 13:49:40
Ja wiem co tam jest.
To jest informacja dla Ciebie, aby wiedzieć jak pobrać datę i wartość. Te elementy to nic innego jak wybrane elementy z tablicy, którą przesyłasz do JS.
zbysiusp
15.07.2016, 13:58:21
Czy tak jest dobrze, bo działa?
Kod
$("#data_min").html(minEl.czas_datetime);
Działa bardzo dobrze tak jak oczekiwałem. Bardzo dziękuję za wielką pomoc i poświęcony czas. Dzięki Tobie wiele się nauczyłem.
Pozdrawiam
zbysiusp
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.