Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Suma konkretnego elementu tablicy dynamicznej jQuery, Tablica: pole A i B dodawane co 1s. Szukam sumy B na bieżąco.
zbysiusp
post 15.07.2016, 07:32:10
Post #1





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

Ostrzeżenie: (0%)
-----


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

Go to the top of the page
+Quote Post
trueblue
post 15.07.2016, 09:05:21
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


https://jsfiddle.net/t5mwmnq9/


--------------------
Go to the top of the page
+Quote Post
zbysiusp
post 15.07.2016, 09:29:36
Post #3





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

Ostrzeżenie: (0%)
-----


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").
Go to the top of the page
+Quote Post
trueblue
post 15.07.2016, 09:36:14
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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ę.


--------------------
Go to the top of the page
+Quote Post
phpion
post 15.07.2016, 09:52:09
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Zamiast liczyć sumę za każdym razem modyfikuj ją: w momencie dopisywania wiersza dodawaj jego wartość, w momencie usuwania wiersza odejmuj jego wartość.
Go to the top of the page
+Quote Post
zbysiusp
post 15.07.2016, 10:00:33
Post #6





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post 15.07.2016, 10:22:30
Post #7





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


http://stackoverflow.com/a/4774081/5889778

Dodaj do kodu podaną tam również funkcję sum.
  1. var fifo=new createRingBuffer(142);
  2. fifo.push(1);
  3. console.log(fifo.sum());
  4. fifo.push(2);
  5. console.log(fifo.sum());


--------------------
Go to the top of the page
+Quote Post
zbysiusp
post 15.07.2016, 10:48:17
Post #8





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

Ostrzeżenie: (0%)
-----


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)


Ten post edytował zbysiusp 15.07.2016, 10:49:13
Go to the top of the page
+Quote Post
trueblue
post 15.07.2016, 10:57:34
Post #9





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
zbysiusp
post 15.07.2016, 11:02:43
Post #10





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
trueblue
post 15.07.2016, 11:07:07
Post #11





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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).


--------------------
Go to the top of the page
+Quote Post
zbysiusp
post 15.07.2016, 11:33:46
Post #12





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

Ostrzeżenie: (0%)
-----


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?

Ten post edytował zbysiusp 15.07.2016, 11:34:10
Go to the top of the page
+Quote Post
trueblue
post 15.07.2016, 11:36:31
Post #13





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
zbysiusp
post 15.07.2016, 11:41:44
Post #14





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

Ostrzeżenie: (0%)
-----


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

Ten post edytował zbysiusp 15.07.2016, 11:46:25
Go to the top of the page
+Quote Post
trueblue
post 15.07.2016, 11:52:26
Post #15





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


https://jsfiddle.net/hre3nu9m/


--------------------
Go to the top of the page
+Quote Post
zbysiusp
post 15.07.2016, 12:09:55
Post #16





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

Ostrzeżenie: (0%)
-----


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)?

Ten post edytował zbysiusp 15.07.2016, 12:11:28
Go to the top of the page
+Quote Post
trueblue
post 15.07.2016, 12:14:12
Post #17





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


https://jsfiddle.net/hre3nu9m/1/


--------------------
Go to the top of the page
+Quote Post
zbysiusp
post 15.07.2016, 12:23:23
Post #18





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

Ostrzeżenie: (0%)
-----


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?

Ten post edytował zbysiusp 15.07.2016, 12:24:04
Go to the top of the page
+Quote Post
trueblue
post 15.07.2016, 12:27:10
Post #19





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Musisz inaczej szukać min i max: http://stackoverflow.com/a/33043619/5889778


--------------------
Go to the top of the page
+Quote Post
zbysiusp
post 15.07.2016, 12:34:46
Post #20





Grupa: Zarejestrowani
Postów: 65
Pomógł: 0
Dołączył: 11.07.2009

Ostrzeżenie: (0%)
-----


Cytat(trueblue @ 15.07.2016, 13:27:10 ) *
Musisz inaczej szukać min i max: http://stackoverflow.com/a/33043619/5889778


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?
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 8.07.2025 - 18:24