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

question-closed Mapowanie json/map do obiektu Javascirpt

42 Warsaw Coding Academy
0 głosów
1,470 wizyt
pytanie zadane 1 września 2020 w JavaScript przez Wiciorny Ekspert (280,970 p.)
zamknięte 2 września 2020 przez Wiciorny

Hej mam obiekt w postaci Jsonu, który generalnie nie posiada nazw pól. 
Poszukuje sposobu w jaki mógłbym to zmapować  : przypisujac Id do numeru, oraz wartosci pod kluczem do nazwy 

Oto jest mapa w postaci jsona która mam 

{
"1": "TEXT1",
"2": "TEXT2",
"3": "TEXT3",
}

a to jest docelowa zmienna w js, w sensie chciałbym mieć te dane w takiej postaci 
 

 var data = [
        {
            "id": "1",
            "name": "Test1"
        },
        {
            "id": "2",
            "name": "Test2"
        }
    ]

Domyślam się , że problem jest dosyć trywialny... ale na co dzień nie miewam styczności z javasciptem, wiec dopiero się uczę. Dzieki.

komentarz zamknięcia: Problem rozwiązany, w oparciu o pomoc w odpowiedziach. Dziękuje

3 odpowiedzi

+2 głosów
odpowiedź 1 września 2020 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 2 września 2020 przez Wiciorny
 
Najlepsza

Użyłbym tutaj Object.entries i zmapował to na docelową tablicę obiektów:

const parsedJSON = JSON.parse(`{"1":"TEXT1","2":"TEXT2","3":"TEXT3"}`);
const data = Object.entries(parsedJSON).map(([key, value]) => ({id: key, name: value}));

Tylko przy mapowaniu ogarnij sobie wielkość liter dla property name, bo widzę, że wejściowo wartości są pisane caps-lockiem, a wyjściowo tylko pierwsza litera jest duża.

komentarz 2 września 2020 przez Wiciorny Ekspert (280,970 p.)

@ScriptyChris  dzięki mam jednak pewien z tym problem
data- zwraca ma postać [object Object],[object Object],[object Object]
ja chciałem to przekazać do okna modalnego boostrap table, jeśli zrobie to na danych zapisanych jak mam 

var data = [
       {
           "id": "1",
           "name": "Test1"
       },
       {
           "id": "2",
           "name": "Test2"
       }
   ]

to, zadziała i automatycznie 

('#modalTable').on('shown.bs.modal', function () {
        console.log(data);
        console.log("I am in bro2");
        $('#mytable').bootstrapTable({
            data:data,
        });
    })

utowrzy mi poprawnie, natomiast jeśli mapuje za pomocą tego co mi przychodzi to niestety zwraca mi błąd 
No matching records found

czy problem nie leży w tym, że dane przekazywane do entries mają format 

{ 1: "Dane"}

 czyli pierwszy element nie jest stringiem 

komentarz 2 września 2020 przez niezalogowany
mógłbyś zrobić console.loga tego JSONa?
komentarz 2 września 2020 przez Wiciorny Ekspert (280,970 p.)

ahh przetesetowałem to 

const parsedJSON = JSON.parse(`{"1":"TEXT1","2":"TEXT2","3":"TEXT3"}`);
  
  var data2 = [
        {
            1: "Test1",
        },
        {
           2: "Test1",
        }
    ];
   
const data = Object.entries(data2).map(([key, value]) => ({id: key+1, name: value}));
  
 console.log(data);

zwraca mi jako wartosc,  w polu name ... niestety 

[{
  id: "0",
  name: {
    1: "Test1"
  }
}, {
  id: "1",
  name: {
    2: "Test1"
  }
}]

w polu name zwracany jest cał obiekt value, a ja właśnie ten value chce rozbić na id i nazwe 
to jest wynik { "id": "1", "name": "Name1} który chciałbym uzyskac 

komentarz 2 września 2020 przez Wiciorny Ekspert (280,970 p.)

Json wygląda tak 

[
    {
            1: "Test1",
        },
        {
           2: "Test1",
        }
  ];

 

komentarz 2 września 2020 przez niezalogowany

ale czemu w 12 linijce do Object.entries wrzuciłeś zmienną data2 zamiast parsedJSON?

1
komentarz 2 września 2020 przez niezalogowany
> Json wygląda tak

Ano właśnie, stąd problemy. W pytaniu podałeś inaczej
komentarz 2 września 2020 przez Wiciorny Ekspert (280,970 p.)

Więc precyzując i poprawiając, przepraszam : 
taki jest JSON 

[
    {
            1: "Test1",
        },
        {
           2: "Test1",
        }
  ];

a oczekiwany rezultat chciałbym 

[
 { "id": "1", 
"name": "Test1",
},
 { "id": "2", 
"name": "Test2",
}
]

i tutaj sie zastanawiam jak to zrobic, zeby to byly nie tyle pola string co dobrac sie do wartosci value dla mapowania, 

komentarz 2 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

Twoje dane wejściowe są tablicą obiektów, a nie obiektem. Więc zrób mapowanie inaczej:

const inputData = [
  {
    1: "Test1",
  },
  {
    2: "Test1",
  }
];

const data = inputData.map((obj) => {
    const [entry] = Object.entries(obj);
    const [key, value] = entry;

    return {
        id: key,
        name: value
    };
});

[treść sprzed powyższych komentarzy]

Wg dokumentacji, property data przesyłane w obiekcie konfiguracyjnym do metody bootstrapTable przyjmuje tablicę obiektów lub obiekt: https://bootstrap-table.com/docs/api/table-options/#data. Może dane wejściowe, które podałeś w pytaniu nie mają spójnego formatowania z tym co faktycznie mapujesz i przekazujesz? Jeśli te dane pochodzą z JSONa, to przydało by się, żebyś pokazał jak on wygląda (przynajmniej jego część).

komentarz 2 września 2020 przez Wiciorny Ekspert (280,970 p.)

Dzięki też rozwiązałem to w taki pewien sposób 

const data = Object.entries(data2).map(([key, value]) => ({
  id: ++key,
  name: value[key]
}));

przeanalizuje jeszcze wasze propozycje, bo też zależy mi na czytelności i jakości kodu, dziękuje za poświęcony czas i pomoc. 

+1 głos
odpowiedź 1 września 2020 przez senpai desu Mądrala (5,720 p.)

Witam

może coś w tym kierunku ?

var test = {
"1": "TEXT1",
"2": "TEXT2",
"3": "TEXT3",
}
var test2 = [];
for( key in test ){
    if (test.hasOwnProperty(key)) {
        
		test2.push({
			id:key,
			name:test[key]
			});
    }   
}

console.log (test2);

kod działa w konsoli przeglądarki,
wygodniej jest przygotować sobie poprawny JSON po stronie serwera a potem JSON.parse()

+1 głos
odpowiedź 1 września 2020 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)

Object/entries

 

const object1 = {
  "1": "TEXT1",
  "2": "TEXT2",
  "3": "TEXT3"
};

let array = [];

for (const [key, value] of Object.entries(object1)) {
  array.push({id: key, name: value})
}

console.log(array)

 

komentarz 1 września 2020 przez Wiciorny Ekspert (280,970 p.)
zdecydowałem się na to rozwiązanie, nie trzeba tutaj określać dodatkowe mapowania?
Bo consolka zwraca mi  mape [object, object]
komentarz 1 września 2020 przez Paweł Nąckiewicz Nałogowiec (48,990 p.)

nie za bardzo rozumiem Twoje pytanie. Za mapowowanie odpowiada funkcja map i to jak ją podłączyć z tym kodem masz pokazane wyżej w odpowiedzi @ScriptyChris

komentarz 1 września 2020 przez Wiciorny Ekspert (280,970 p.)

chodzi mi o fakt, że używając twojego przykładu na consol.log mam 

Tablica [object Object],[object Object]

stąd sądziłem, że czegoś brakuje. Dzieki mimo wsio ogarnę w swoim zakresie :) 

Podobne pytania

0 głosów
0 odpowiedzi 165 wizyt
0 głosów
0 odpowiedzi 382 wizyt
pytanie zadane 19 kwietnia 2022 w C# przez CdxProj Użytkownik (910 p.)
0 głosów
1 odpowiedź 229 wizyt
pytanie zadane 27 listopada 2017 w PHP przez Ehlert Ekspert (215,010 p.)

93,383 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,744 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...