Wykrywanie obiektów w obiekcie i wypisywanie danych z tego obiektu

1

Dobry wieczór. Chciałem zapytać, czy działanie w zmiennej res można by było inaczej zapisać. Próbowałem rekurencji, ale wychodzi mi zły wynik. Wartość ma być zwracana jak na załączonym zdjęciu, jakieś pomysły?

const getInfo = (tr, data) => { //data - dane z serwera, //tr - wiersz tabeli wyciśniętej przez przycisk
   const k = keys.valueOf(); // Zwraca ["id","name","username","email", "phone", "website"]
   const v = [...tr.children].map(item => item.textContent) //Wartości w komórkach tabeli

   const result = conv_To_Object(k, v) //Zamiana danych o kluczach k i danych v w obiekt
   const findData = data.find(item => checkData(item, result, k)) //Porównywanie wartości z danymi serwera, a wartością zwracaną w result  i odnajdowanie prawidłowych danych
   
    const res = Object.entries(findData).reduce((total, [key, value], index, arr) => { //Tworzenie odpowiedzi
        if(typeof value == "object") return total += `\n\n${key}:\n` + Object.entries(value).reduce((t, [keys, values]) => {
            if(typeof values == "object") return t+= `\n    ${keys}:\n` + Object.entries(values).reduce((all, [wrench, val]) => {

                return all += `         ${wrench}: ${val}\n`
            }, '')

            return t += `   ${keys}: ${values}\n`
        }, '')

        return total += `\n${key}: "${value}"`
    }, '')

    alert(res)
}

Zrzut ekranu (38).png

Dane są zapisanie w json i wyglądają następująco:

Zrzut ekranu (39).png

Chodzi mi o to, że jeżeli w wartości obiektu jest inny obiekt, to wypisywało mi dane z tego obiektu, a jeżeli trafiłby się tam jeszcze jakiś obiekt, to też wypisze jego dane i tak dalej. Proszę o pomoc.

0

Dobra. Znalazłem już rozwiązanie. Ale nadal ciekawi mnie, jakby ten problem można by było inaczej rozwiązać.

1

Próbowałem rekurencji, ale wychodzi mi zły wynik

W tym kodzie nie widzę rekurencji, pewnie chodzi ci o kawałek kodu, którego nie wrzuciłeś?
Bo ogólnie za pomocą rekurencji się da to rozwiązać.
Możesz tworzyć sobie funkcję, która robi coś takiego (w pseudokodzie)

funkcja odwiedź(obiekt, poziom_zagnieżdżenia)
   dla każdej właściwości w obiekt
       jeśli obiekt[właściwość] jest obiektem
          odwiedź obiekt[właściwość], poziom_zagnieżdżenia + 1
       jeśli nie
           rób coś (np. wyświetl właściwość)
  if(typeof value == "object")

Nie tak się sprawdza, czy coś jest obiektem w JS. Jak value będzie równe null to ten if ci zwróci true, bo typeof null === 'object', a jak zrobisz Object.entries(null), to ci rzuci wyjątkiem Uncaught TypeError: Cannot convert undefined or null to object.
Jeśli chcesz sprawdzić, czy coś jest obiektem, to musisz dodatkowo upewnić się, czy nie jest to null, np.

  if(value && typeof value == "object")
0

@LukeJL: Wiem, co to rekurencja i słusznie stwierdziłeś że jej nie wstawiłem. Otóż chciałem zamienić poniższy kod, w rekurencje.

const res = Object.entries(findData).reduce((total, [key, value], index, arr) => { //Tworzenie odpowiedzi
    if(typeof value == "object") return total += `\n\n${key}:\n` + Object.entries(value).reduce((t, [keys, values]) => {
        if(typeof values == "object") return t+= `\n    ${keys}:\n` + Object.entries(values).reduce((all, [wrench, val]) => {

            return all += `         ${wrench}: ${val}\n`
        }, '')

        return t += `   ${keys}: ${values}\n`
    }, '')

    return total += `\n${key}: "${value}"`
}, '')

Otóż udało mi się już go zrobić, a wygląda następująco:

//Tworzenie odpowiedzi w alercie z obiektu
const Object_parse = (value, space = 2) => {
    return Object.entries(value).reduce((t, [keys, values]) => {

        //Jeżeli wartość jest obiktem to wykonaj rekurencję
            if(values && typeof values == "object") return t += `\n ${" ".repeat(space+1)}${keys.cap()}:\n`+ Object_parse(values, space+=2);

        return t += `${"    ".repeat(space - 1)}${keys.cap()}: "${values.cap()}"\n`
    }, '')
}

i dziękuję ci za odpowiedź oraz dziękuję za pokazanie mi tego:

if(value && typeof value == "object")

Szczerze, to nie wiedziałem że typeof null zwraca object. Dziękuję ci za to oraz życzę ci miłego wieczoru.

1

Dziękuję ci za to oraz życzę ci miłego wieczoru.

Nawzajem.

Szczerze, to nie wiedziałem że typeof null zwraca object.

Bo to jest JS, tu się dzieją dziwy i pełno pułapek.

Object_parse(values, space+=2)

Niepotrzebnie mutujesz zmienną space. Tutaj wystarczyłoby space + 2.
W tym przypadku może to nie będzie mieć znaczenia, bo i tak dajesz return (więc wychodzisz z funkcji), ale wystarczy, że zmienisz strukturę kodu, a przez ten kod możesz mieć problemy, jak się okaże, że zmienna space się nagle zmienia w trakcie funkcji.

1

@ArashiYT:

Szczerze, to nie wiedziałem że typeof null zwraca object.

To jest taki lepszy typeof, który warto zapamiętać:

toString.call(someValue).slice(8, -1) === 'Null'
0
LukeJL napisał(a):

Niepotrzebnie mutujesz zmienną space. Tutaj wystarczyłoby space + 2.
W tym przypadku może to nie będzie mieć znaczenia, bo i tak dajesz return (więc wychodzisz z funkcji), ale wystarczy, że zmienisz strukturę kodu, a przez ten kod możesz mieć problemy, jak się okaże, że zmienna space się nagle zmienia w trakcie funkcji.

O dziękuję. Nie wiedziałem o tym. Dziękuję za pomoc

akievi napisał(a):

To jest taki lepszy typeof, który warto zapamiętać:

toString.call(someValue).slice(8, -1) === 'Null'

i też o tym. Mimo, że używam JS od około 3 lata, to i tak nie wiem o paru rzeczach. Dziękuję bardzo.

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