Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Suma konkretnego elementu tablicy dynamicznej jQuery
Forum PHP.pl > Forum > Po stronie przeglądarki
zbysiusp
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
https://jsfiddle.net/t5mwmnq9/
zbysiusp
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
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
Zamiast liczyć sumę za każdym razem modyfikuj ją: w momencie dopisywania wiersza dodawaj jego wartość, w momencie usuwania wiersza odejmuj jego wartość.
zbysiusp
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
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());
zbysiusp
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
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
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
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
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
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
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
https://jsfiddle.net/hre3nu9m/
zbysiusp
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
https://jsfiddle.net/hre3nu9m/1/
zbysiusp
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
Musisz inaczej szukać min i max: http://stackoverflow.com/a/33043619/5889778
zbysiusp
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?
trueblue
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
Cytat(trueblue @ 15.07.2016, 13:38:38 ) *
Przecież tą tablicą jest data.

https://jsfiddle.net/hre3nu9m/2/


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)

JSON

Cytat(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
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
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));

obiekt
Trzeba je tylko "wyciągnąć" i przekazać do <div>, ale jak?
trueblue
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
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.