[JSON] arrays vs objects probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 28-06 10:32
Optie A:
code:
1
2
3
4
5
6
7
8
9
10
11
12
[
  {
    "id": "06bda920-bc61-11e4-96e5-0002a5d5c51b",
    "label": "Label A",
    "data": "Somedata"
  },
  {
    "id": "24234423-aa12-2314-9555-12312315aa1b",
    "label": "Label B",
    "data": "Some more data"
  }
]

Voordeel is dat de volgorde van de items vast staat. Het object met Label A zal altijd de bovenste zijn en het Object met Label B is altijd de tweede. Het nadeel is echter dat we nu een "niet zeggende" array key hebben.

Optie B:
code:
1
2
3
4
5
6
7
8
9
10
{
  "06bda920-bc61-11e4-96e5-0002a5d5c51b": {
    "label": "Label A",
    "data": "Somedata"
  },
  "24234423-aa12-2314-9555-12312315aa1b": {
    "label": "Label B",
    "data": "Some more data"
  }
}

Volgorde van beide objecten staat niet vast. Objecten zijn echter veel makkelijker te vinden aangezien de key een nuttige waarde heeft die we al kennen.

Nu gebruikte ik meestal Optie B, echter heb ik nu het probleem dat de volgorde van de objecten ook van belang is en mijn vraag is nu of er echt geen andere manier is om bij Optie B toch de volgorde direct te behouden (zonder een sort toe te voegen aan de objecten, waarna ik de data dus elke keer moet sorteren na het inlezen). Nadeel hierbij van Optie A is, is dat als ik opzoek ben naar een key ik door alle objecten volgens mij heen moet loepen. Iemand die hier nog nuttig tips heeft?

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
Volgende heb ik in PHP gegooid.
PHP:
1
2
3
4
5
6
7
8
$array = array(
    'a' => array(),
    'b' => array(),
    'c' => array(),
    'd' => array(),
);

echo json_encode($array);

Volgorde: a,b,c,d

Als ik C en D omdraai dan zie ik ook het verschil in de JSON. Is de volgorde niet dat hoe jij de lijst vult?

Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 28-06 10:32
4Real schreef op dinsdag 24 februari 2015 @ 21:44:
Als ik C en D omdraai dan zie ik ook het verschil in de JSON. Is de volgorde niet dat hoe jij de lijst vult?
Dat dacht ik ook altijd, maar dat is dus helaas niet zo. Zodra je in JSON objects gebruikt, moet je het behandelen als een un ordered list, in mijn geval was het dus zo dat de JSON parser in javascript (data afkomstig uit PHP) de volgorde dus gewoon naar ABCD zou zetten.. Ook al levert PHP het aan als ABDC.

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • NNF
  • Registratie: November 2003
  • Laatst online: 29-11-2024

NNF

Volgens de JSON-standaard:
An object is an unordered collection of zero or more name/value
pairs, where a name is a string and a value is a string, number,
boolean, null, object, or array.
Dus nee, je kunt er inderdaad niet vanuit gaan dat de volgorde van de data in een object altijd gelijk is. Meestal gaat het goed, maar je kunt er gewoon niet op vertrouwen.

De meeste frameworks bevatten wel functies om redelijk makkelijk het gewenste object uit een array te halen. Underscore.js heeft bijvoorbeeld find en where, jQuery heeft $.grep.

[ Voor 3% gewijzigd door NNF op 24-02-2015 22:05 ]


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 28-06 10:32
Ik heb zelf ook nog even verder zitten zoeken, maar schijnbaar duurt het zoeken in een array ongeveer even lang als een object direct benaderen via een key value. Dus ik gok dat het dan het netste is om toch naar voor Optie A tegaan met foreach loop om de juiste items op te halen indien nodig. Mocht iemand hier toch nog betere ideeen over hebben dan hoor ik dat natuurlijk graag.

Ben gewoon zo gewend om voor optie B tegaan in PHP, dus het verbaasde me in eerste instantie nogal toen ik tegen dit probleem aanliep toen ik mijn PHP data omzetten naar JSON om het zo door te kunnen sturen naar javascript.

[ Voor 34% gewijzigd door Uhmmie op 24-02-2015 22:17 ]

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • NNF
  • Registratie: November 2003
  • Laatst online: 29-11-2024

NNF

Het is niet alleen de netste oplossing, als de volgorde belangrijk is dan is het de enige oplossing :P

[ Voor 3% gewijzigd door NNF op 24-02-2015 22:17 ]


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 05:10
Ik vraag me af of optie B niet sneller is bij enorm grote objecten. Op een gegeven moment moet een index in een dictionary of hoe die dingen onderwater ook worden gemaakt in de javascript engine het toch winnen van een iteraties over een array.

Acties:
  • 0 Henk 'm!

  • SideShow
  • Registratie: Maart 2004
  • Laatst online: 16-06 15:55

SideShow

Administrator

Tenzij het gaat over duizenden en duizenden entries in je array ... ga dan voor een gewone array en zoek je entry met de juiste id. Kan je niets doen met voorsorteren op de server? Dan eventueel binary search doen in je array? Of de index in je array bijhouden als je iets gevonden hebt? Caching, ...

Of anders, als je helemaal zot wil doen, maak van je array ook een object, met id's als properties en array indexen als values.
Dan heb je 1 maal je array geloopt, en heb je vanaf dan altijd een minimale en constante "zoek"tijd.

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 12-07 22:24
Wat dacht je van optie C?

JSON:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
  "keys" : {
    "06bda920-bc61-11e4-96e5-0002a5d5c51b" : 0,
    "24234423-aa12-2314-9555-12312315aa1b" : 1
  },
  "data" : [{
    "id"    : "06bda920-bc61-11e4-96e5-0002a5d5c51b",
    "label" : "Label A",
    "data"  : "Somedata"
  }, {
    "id"    : "24234423-aa12-2314-9555-12312315aa1b",
    "label" : "Label B",
    "data"  : "Some more data"
  }]
}


Direct gesorteerd bereikbaar en als dictionary lookup v/d keys naar de indices ook bereikbaar.
Het is wel data-duplicatie, dus het kan de moeite lonen om eenmalig clientside de key->index lookup te construeren ipv deze redundante data daadwerkelijk over-the-wire te sturen.

[ Voor 14% gewijzigd door R4gnax op 25-02-2015 00:17 ]


Acties:
  • 0 Henk 'm!

  • Uhmmie
  • Registratie: Januari 2000
  • Laatst online: 28-06 10:32
Allemaal bedankt voor de reacties. Hoe meer ik er overna denk hoe meer ik wil gaan voor Optie A, met vervolgens iets van een reference list.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[
  {
    "id": "06bda920-bc61-11e4-96e5-0002a5d5c51b",
    "label": "Label A",
    "data": "Somedata",
    "childs": [
      {
        "id": "32455555-bc61-11e4-96e5-0002a5d5c51b",
        "label": "Label A.1",
        "data": "Some subdata"
      }
    ]
  },
  {
    "id": "24234423-aa12-2314-9555-12312315aa1b",
    "label": "Label B",
    "data": "Some more data"
  }
]


Vervolgens tijdens de aanroep loop ik dan door alle objecten heen, waarna ik een platte reference lijst bij hou in een object met als key het id en als data een "reference" naar de plek in het hoofd object. Voordeel is dat ik dan dus ook direct toegang hou naar alle childs zonder dan ik dan keer op keer op keer recursive door al mijn data hoef te lopen.

[ Voor 8% gewijzigd door Uhmmie op 25-02-2015 07:12 ]

Currently playing: MTG Arena (PC)


Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Een lookup kun je toch prima clientside opstellen. Op het moment dat je straks op label wilt gaan zoeken, of eventueel straks een ander veld, ga je die dan ook toevoegen aan de datastructuur? Ik zou gewoon optie A pakken, en vervolgens de nodige indices aan de client kant op gaan lossen.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Als je zelf serverside en clientside beheert kun je toch gewoon optie A gebruiken omdat je dan zelf de volgorde kunt bepalen, ik zie het probleem niet zo :)

Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Cartman! schreef op woensdag 25 februari 2015 @ 10:19:
Als je zelf serverside en clientside beheert kun je toch gewoon optie A gebruiken omdat je dan zelf de volgorde kunt bepalen, ik zie het probleem niet zo :)
:X dan is het dus geen JSON meer, maar een formaat dat héél erg op JSON lijkt maar net even andere eigenschappen heeft. Dat werkt misschien zolang je aan beide kanten PHP gebruikt, maar zogauw je iets wat niet PHP is gebruikt is je ordening opeens verdwenen. ik moet leren lezen; optie A is prima, optie B met 'impliciete ordening' niet

[ Voor 21% gewijzigd door ValHallASW op 25-02-2015 11:14 ]


Acties:
  • 0 Henk 'm!

  • Naranya
  • Registratie: Oktober 2010
  • Laatst online: 08:00
Altijd voor optie A gaan, bij optie B mis je clientside namelijk informatie over je objecten; dat elk object een "id" property heeft, wat zeggen wil dat de client magisch moet weten dat je array index het "id" is.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Naranya schreef op woensdag 25 februari 2015 @ 20:54:
Altijd voor optie A gaan, bij optie B mis je clientside namelijk informatie over je objecten; dat elk object een "id" property heeft, wat zeggen wil dat de client magisch moet weten dat je array index het "id" is.
Ik zou hem nuanceren naar : de oplossing moet bij het vraagstuk passen...

Wil je een array oversturen en opvangen dan moet je voor optie A gaan.
Wil je JSON objecten oversturen en opvangen dan moet je voor optie B gaan, met als toevoeging dat je object een volgorde moet bevatten zodat je daar op kan sorteren.

Het is me niet helemaal duidelijk wat de wens is, aan de ene kant is er de wens om een gesorteerde lijst te krijgen, aan de andere kant is er de wens om rechtstreeks op een id te prikken.
Ik heb zoiets van : Zijn het niet 2 verschillende webpagina's die gewoon net naar gelang de wens A of B vereisen.
Of zit het echt in 1 webpagina en moet het transport bijv op volgorde maar kan je het voor de verdere verwerking in JS omzetten van array naar objecten met indexen
Pagina: 1