• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Iterowanie po obiektach wewnatrz innego, duzego obiektu

VPS Starter Arubacloud
0 głosów
404 wizyt
pytanie zadane 3 grudnia 2018 w JavaScript przez Paweł Wyrwa Użytkownik (500 p.)

Witam. Jak w temacie. Szukam sposobu na iterowanie po obiektach potomnych. Spiesze z wyjasnieniem o co chodzi, dodatkowo przepraszam za brak polskich znakow - nie mam polskiej klawiatury. Nie mam gotowego kodu, ktory bylbym w stanie przytoczyc, ale wyobrazmy sobie dana sytuacje. 

var planety = {
                       ziemia: {
obwod: 100,
masa: 500, 
odegloscOdSlonca: 1000

                                    },
                        mars: {
obwod: 200,
masa: 750,
odlegloscOdSlonca: 2000                                 
 }
};

Oczywiscie jest to hipotetyczny przyklad, byc moze z bledami w zapisie.

Chcialbym iterowac po kluczach "obwod" "masa" "odlegloscOdSlonca". 

Przychodza mi pewne rozwiazania do glowy, typu instrukcja warunkowa wewnatrz peti for ... in " if key === "ziemia" for (var key in ziemia) ". Mozna tez uzyc switch-case, ale wiaze sie to z wpisywaniem nazwy kazdej planety. 

Ale co jezeli dodam wszystkie planety z naszego ukladu slonecznego, a instrukcje ktore maja sie wykonac dla kazdego obiektu beda liczyly po 200 linijek kodu, nie chcialbym "zdziesieciokrotniac" mojego kodu, czy jak kto woli wolalbym uniknac redundancji. Moglbym oczywiscie stworzyc dla kazdej planety osobny obiekt, ale wtedy rowniez nie unikne redundancji, ani nie rozwiaze to mojego problemu. Pozdrawiam. 

1 odpowiedź

+3 głosów
odpowiedź 3 grudnia 2018 przez Tomek Sochacki Ekspert (227,510 p.)

Ja bym to zrobił nieco inaczej, np:

const planets = [
  {
    name: 'ziemia',
    distanceFromSun: 1000
  },
  {
    name: 'mars',
    distanceFromSun: 2000
  },
]

planets.forEach(({distanceFromSun}) => console.log(`Distance: ${distanceFromSun}`));
// Distance: 1000
// Distance: 2000

To tak na szybko w prosty sposób - generalnie to jeśli masz jakąś kolekcję, po której chcesz iterować to najprawdopodobniej powinna to być tablica (pomijając pewne typy specjalne). Jeśli jest inaczej to warto cofnąć się i sprawdzić czy na pewno dobrze zaprojektowaliśmy strukturę danych.

Moja tablica zawiera planety, które są obiektami i w metodzie forEach po prostu odwołuję się do poszczególnych elementów w danej iteracji.

komentarz 4 grudnia 2018 przez Paweł Wyrwa Użytkownik (500 p.)
Rozumiem, dzieki! Ale mam jeszcze pytanie, jaka jest funkcja operatora => w petli forEach?
komentarz 4 grudnia 2018 przez Paweł Wyrwa Użytkownik (500 p.)
Dzieki!
komentarz 4 grudnia 2018 przez Paweł Wyrwa Użytkownik (500 p.)

@Tomek Sochacki,

planets.forEach(({name}) => console.log(`name: ${name}`));

Dodałem taką linijkę kodu i nie jest to, co chcę osiągnąć. Zależy mi na tym, aby klucz oraz wartości były automatycznie odczytywane niezależnie od tego jaka jest akurat nazwa klucza. Po drugie chciałbym osiągnąć efekt w postaci naprzemienności wyników tj. 
Nazwa: Ziemia 
Odeglość: 1000 

Nazwa: Mars
Odległość: 2000 

Nazwa: Jowisz
Odległość: 10000

W rezultacie Twojej pomocy otrzymuje: 
Nazwa: ziemia
Nazwa: mars
Odleglosc: 1000
Odleglosc: 2000 

Dodatkowo Nazwa i Odleglosc wpisane jest w kodzie, czego chciałem uniknąć. Pozdrawiam

komentarz 4 grudnia 2018 przez Tomek Sochacki Ekspert (227,510 p.)
Wybacz, ale kompletnie nie rozumiem...

Po pierwsze to iterowanie po polach, których nazwy są tworzone dynamicznie to trochę ryzykowne rozwiązanie, raczej lepiej tego unikać, czasami stosuje się co prawda takie typy o nieznanych kluczach w interfejsach np. TS ale to są wyjątkowe sytuacje.

Najlepiej daj po prostu swój obiekt, po którym chcesz iterować (który powinien być tablicą, ale nie jest to oczywiście wymóg) i powiedz co dokładnie chcesz osiągnąć.
komentarz 4 grudnia 2018 przez Paweł Wyrwa Użytkownik (500 p.)
const obiekt = {
  podobiekt1: {
    klucz1: "wartosc1a",
    klucz2: "wartosc2a",
    klucz3: "wartosc3a"
  },
  podobiekt2: {
    klucz1: "wartosc1b",
    klucz2: "wartosc2b",
    klucz3: "wartosc3b"
  },
  podobiekt3: {
    klucz1: "wartosc1c",
    klucz2: "wartosc2c",
    klucz3: "wartosc3c"
  }
};
for(let key in obiekt) {

          for (let key2 in obiekt[key]) {
          console.log(key2 +": " +obiekt[key][key2]);
          }
}

Doszedłem sam już do rozwiązania, dokładnie o to mi chodziło. 

Wynikiem skryptu jest: "klucz1: wartosc1a" itd. 

Być może nie do końca skonkretyzowałem swoje zapytanie, stąd ciężko było to zrozumieć, ale w każdym razie wielkie dzięki za chęci! :) 

komentarz 4 grudnia 2018 przez Tomek Sochacki Ekspert (227,510 p.)
A ja dalej będę się upierał, że nie widzę żadnego logicznego uzasadnienia dlaczego "obiekt" nie miały być tablicą z Array.prototype - moim zdaniem takie kombinowanie jest zupełnie niepotrzebne, ale jak uważasz, Twój kod, w każdym razie mojego CR być nim nie przeszedł i było by "need work" jak nic :)
komentarz 4 grudnia 2018 przez Paweł Wyrwa Użytkownik (500 p.)
podobiekt1.forEach(({klucz1}) => console.log(`Klucz1: ${klucz1}`));
podobiekt1.forEach(({klucz2}) => console.log(`Klucz2: ${klucz2}`));
podobiekt1.forEach(({klucz3}) => console.log(`Klucz3: ${klucz3}`));


podobiekt2.forEach(({klucz1}) => console.log(`Klucz1: ${klucz1}`));
podobiekt2.forEach(({klucz2}) => console.log(`Klucz2: ${klucz2}`));
podobiekt2.forEach(({klucz3}) => console.log(`Klucz3: ${klucz3}`));



podobiekt3.forEach(({klucz1}) => console.log(`Klucz1: ${klucz1}`));
podobiekt3.forEach(({klucz2}) => console.log(`Klucz2: ${klucz2}`));
podobiekt3.forEach(({klucz3}) => console.log(`Klucz3: ${klucz3}`));



Jakoś tak by to musiało wyglądać gdybym użył Twojego sposobu. Każdy podobiekt będzie miał 50 kluczy, na których będą wykonywane setki linijek kodu. Z całym szacunkiem, bo jesteś na pewno bardziej doświadczony ode mnie, ale nie wydaje mi się to rozwiązanie lepsze od mojego. Pozdrawiam. 

komentarz 4 grudnia 2018 przez Tomek Sochacki Ekspert (227,510 p.)

ja nic nie mówiłem o tworzeniu miliarda forEach :)

dobra, nie upieram się bo widzę, że Cię nie przekonam, ale jak dla mnie to kompletnie bez sensu usilnie iterować po obiekcie, gdy można zrobić po prostu Array<object> i iterujesz normalnymi pętlami czy metodami Array.prototype po całej kolekcji...,

a tak wracając do tego przykładu co podałeś to jeśli chcesz po prostu wyświetlić wszystkie wartości podobiektów jako jedną dużą listę to można to zrobić np. tak:

Object.values(obiekt)
  .forEach(podobiekt => Object.entries(podobiekt)
    .forEach(([key, val]) => console.log(`${key}: ${val}`)
  )
);
klucz1: wartosc1a
klucz2: wartosc2a
klucz3: wartosc3a
klucz1: wartosc1b
klucz2: wartosc2b
klucz3: wartosc3b
klucz1: wartosc1c
klucz2: wartosc2c
klucz3: wartosc3c

ale to nie jest fajne rozwiązanie na produkcję... ale jak pisałem, już się nie upieram i kończę dyskusję :)

Podobne pytania

0 głosów
1 odpowiedź 346 wizyt
pytanie zadane 10 lutego 2018 w JavaScript przez Alterwar Dyskutant (7,650 p.)
0 głosów
1 odpowiedź 380 wizyt
pytanie zadane 4 września 2019 w Python przez mroczny123 Początkujący (290 p.)
0 głosów
1 odpowiedź 1,196 wizyt
pytanie zadane 7 października 2017 w Grafika i multimedia przez DODO Bywalec (2,950 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...