Sumowanie elementów tablicy

0

Cześć, mam takie zagadnienie, że chciałbym posumować w typescript/js dane tablic, tak aby mieć jedną tablicą z posumowanymi wszystkimi elementami - w załączniku jest screen.
Czyli reasumując chciałbym koniec końców otrzymać jedną tablicę z 4 elementami z posumowanymi wartościami. Jak mogę takie coś uzyskać? Próbowałem kombinować coś z reduce, ale nie mam za bardzo pomysłu.

0

Na załączonym zrzucie ekranu widzę dwie tabele, z których każda ma 4 elementy. Każdy element jest obiektem; aczkolwiek widzę, że pierwsze elementy obu tablic mają podobną strukturę; również wszystkie kolejne elementy mają podobną strukturę w obu tablicach. Jak chcesz to dokładnie "podsumować"?


PS. Nie chodzi mi o to, jaką chcesz mieć strukturę ogólną – napisałeś: jedna tablica, w której każdy element odpowiada podsumowaniu odpowiednich elementów z obu tablic wejściowych. Chodzi mi o to, jak mają zostać podsumowane dane na poziomie poszczególnych elementów (tj. u Ciebie – obiektów).

0
Silv napisał(a):

Na załączonym zrzucie ekranu widzę dwie tabele, z których każda ma 4 elementy. Każdy element jest obiektem; aczkolwiek widzę, że pierwsze elementy obu tablic mają podobną strukturę; również wszystkie kolejne elementy mają podobną strukturę w obu tablicach. Jak chcesz to dokładnie "podsumować"?


PS. Nie chodzi mi o to, jaką chcesz mieć strukturę ogólną – napisałeś: jedna tablica, w której każdy element odpowiada podsumowaniu odpowiednich elementów z obu tablic wejściowych. Chodzi mi o to, jak mają zostać podsumowane dane na poziomie poszczególnych elementów (tj. u Ciebie – obiektów).

Chciałbym aby wynikiem była jedna tablica składająca się również z 4 elementów, które byłyby z kolei sumą wszystkich składowych z dwóch tablic (oczywiście chodzi mi o pola typu numerycznego)

0

Jak rozumiem, chcesz sumować jedynie wartości przechowywane w obiektach będących pierwszymi elementami obu tablic. Skoncentruję się tylko na tym, bo resztę elementów można zawsze dodać.

Widzę tutaj dwa podejścia, w zależności od sensowności w domenie danych i liczby haseł w rozpatrywanych obiektach (na końcu przykładowych danych widzę wielokropek):

  1. Jeżeli spełnione są wszystkie trzy warunki: (a) w tych obiektach nie ma zbyt wielu danych, (b) jest to sensowne w domenie danych oraz (c) znasz z góry wszystkie klucze – to może najlepiej byłoby sumować bezpośrednio po kluczach, tj. w taki sposób:
const arr1 = [
    { Anna: 1.2, Bartłomiej: 2.3, Czesław: 3.4, Danuta: 4.5 },
    /* tu pozostałe 3 elementy */
];
const arr2 = [
    { Anna: 5.6, Bartłomiej: 6.7, Czesław: 7.8, Danuta: 8.9 },
    /* tu pozostałe 3 elementy */
];
const result = [
    { Anna: arr1[0].Anna + arr2[0].Anna, ...},
    /* tu nic? */
];
  1. Jeżeli którykolwiek z trzech warunków wymienionych w punkcie nr 1 jest niespełniony, można spróbować przekształcić obiekt z pierwszego elementu do postaci tablicy i potem na nim działać. — Miej na uwadze, że wszelkie przekształcenia (jakie ja znam, czyli Object.entries, Object.values itd.) operują na hasłach obiektu (tj. na parach klucz-wartość) w losowej kolejności. W związku z tym nie możesz na tej kolejności polegać. (Być może w którejś nowszej wersji ECMAScriptu wyszły jakieś ulepszenia co do tej właściwości operowania na obiektach, ale ja nic o tym nie wiem). — Summa summarum, mogłoby to wyglądać tak:
const arr1 = [
    { Anna: 1.2, Bartłomiej: 2.3, Czesław: 3.4, Danuta: 4.5 },
    /* tu pozostałe 3 elementy */
];
const arr2 = [
    { Anna: 5.6, Bartłomiej: 6.7, Czesław: 7.8, Danuta: 8.9 },
    /* tu pozostałe 3 elementy */
];

// arr1[0] i arr2[0], bo tylko pierwszy element nas interesuje
//  – tylko on zawiera dane numeryczne
const arr1FirstObjEntries = Object.entries(arr1[0]);
const arr2FirstObjEntries = Object.entries(arr2[0]);

const result = arr1FirstObjEntries.map((e1) => {
    const arr2FirstObjRelatedEntry = arr2FirstObjEntries.find((e2) => e1[0] === e2[0]);
    return { [e1[0]]: e1[1] + arr2FirstObjRelatedEntry[1] };
});

// W celu sprawdzenia, czy wynik się zgadza z oczekiwaniami
console.log(arr1);
console.log(arr2);
console.log(result);

Rada: zwracaj uwagę na kompatybilność poszczególnych używanych funkcji, obiektów itd. z danym silnikiem JavaScriptu; szczególnie, jeśli kod ma działać w wielu różnych miejscach, np. na wielu przeglądarkach.


UPDATE:

Nie podałeś, czy Twoje dane są spójne (lub czy w ogóle o tym wiesz, lub czy możesz to przewidzieć). W praktyce, jak mniemam, może się zdarzyć, że w obiekcie w pierwszej lub w drugiej tablicy albo (1) nie wszystkie klucze będą takie same, albo (2) niektórych haseł będzie po prostu brakować (czyli liczby haseł w obu obiektach będą się różnić). W związku z tym widzę co najmniej dwa problemy:

  1. Jeśli nie wszystkie klucze (tym samym hasła) obiektu w tablicy arr1 będą mogły zostać znalezione w obiekcie w tablicy arr2, to wywołanie funkcji find w linijce
const arr2FirstObjRelatedEntry = arr2FirstObjEntries.find((e2) => e1[0] === e2[0]);

będzie zwracać undefined. Powinieneś zatem to obsłużyć. Takie obsłużenie zależy od kilku czynników. Nie wiem, może rozsądnie byłoby po prostu zwracać obiekt z tablicy arr1 w rozumieniu, że jak jest tylko jeden element sumy, to jest on równy całej sumie?

  1. Jeśli nie wszystkie klucze (tym samym hasła) obiektu w tablicy arr2 będą mogły zostać znalezione w obiekcie tablicy arr1 (czyli odwrotnie niż w punkcie 1), to nie wszystkie elementy znajdą się w obiekcie wynikowym. To także trzeba by obsłużyć.

UPDATE2: Zmieniłem niektóre zwroty w "update" na takie, które być może lepiej przekazują, co chcę powiedzieć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1