• 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

Object Storage Arubacloud
0 głosów
1,021 wizyt
pytanie zadane 1 września 2020 w JavaScript przez Wiciorny Ekspert (269,710 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 (269,710 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 (269,710 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 (269,710 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 (269,710 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 (269,710 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 (269,710 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 (269,710 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 94 wizyt
0 głosów
0 odpowiedzi 277 wizyt
pytanie zadane 19 kwietnia 2022 w C# przez CdxProj Użytkownik (910 p.)
0 głosów
1 odpowiedź 185 wizyt
pytanie zadane 27 listopada 2017 w PHP przez Ehlert Ekspert (212,670 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...