ugrás a tartalomhoz

JavaScript - tömb átalakítása json-re

janez · 2013. Júl. 13. (Szo), 03.52
Sziasztok.

Az egyik blogmark alatt MadBence küldött be egy linket.

A jsperf.com-ot. Eléggé érdekes egy oldal, szerintem vitatható a pontossága. De a lényeg, hogy az egyik feladatom közepette nagy mennyiségű tömböt alakítok json-re.

A lényeg, az hogy van egy tömb amiben vannak elemek és azt kell megváltoztatni úgy, hogy az ID legyen a tömb indexe.

// ezt
[
  { id: 'id1', ...}, 
  { id: 'id2', ...}, 
  ...
]  
// erre
{ 
  'id1': { ... }, 
  'id2': { ...}
  ... 
}
Két úton indultam el. Az egyik, hogy for-al végig megyek és átmásolom. Illetve eszembe jutott egy másik. Az, hogy shift-elem. (Az előző tömb már úgy sem fog kelleni)

Nos ennek okán gyorsan össze is dobtam egy benchmark-ot:
http://jsperf.com/transform-array-by-janez/2

Kezdetben fura volt, hogy a shift-es mennyivel gyorsabb 5000 elemre. Így megcsináltam kezdve 1000-től 100 000-ig (különböző léptékekben).

Az eredmény: https://docs.google.com/spreadsheet/ccc?key=0As3XcbDM6ADadGdtNS1nSkhrVjdiazdlQjUzRGNKd1E#gid=0
(másik munkalapon a Firefox)

Nektek mi a véleményetek?

Szerk.: Már éjjel van és a pop-ot kihagytam :S
Bár úgy néz ki ez teljesít a legjobban.
20 000 elemre (Chrome 28) ops/sec
hagyományos: 85.96
shift: 21 324 515
pop: 23 627 751

140 000 elemre a
hagyományos: 12.43
shift: 0.07
pop: 13.28

20 000 elemre (Firefox 22)
hagyományos: 82.28
shift: 4.25
pop: 32 667 773

Ekkora különbség lenne a két böngésző között.
 
1

Így elsőre annyit tennék

bamegakapa · 2013. Júl. 13. (Szo), 13.10
Így elsőre annyit tennék hozzá, hogy lehet, nem vagy tisztában a JSON jelentésével. A JSON-ban is van tömb.
3

Hát én sem értem, hogy minek

inf · 2013. Júl. 13. (Szo), 13.36
Hát én sem értem, hogy minek ez a transzformáció...
4

Azért van szükségem az

janez · 2013. Júl. 14. (V), 16.35
Azért van szükségem az átalakításra, mert az indexek nem számok, hanem mongoID-k.
Azaz van egy tömb [elem1,elem2, elem3]. Minden elem a tömbben egy JSON dokumentum mongodb-ből. Itt a tömbben az eredeti indexek számok.
Nekem arra van szükségem, hogy a mongo id alapján rátudjak mutatni 1 adott elemre. Ehhez át kell alakítanom. Példában ezért nem számot raktam ki indexnek.
5

Köszönöm a válaszod, de

janez · 2013. Júl. 14. (V), 16.59
Így elsőre annyit tennék hozzá, hogy lehet, nem vagy tisztában a JSON jelentésével. A JSON-ban is van tömb.


Köszönöm a válaszod, de tisztában vagyok vele.
Lehet, hogy a címem egy kicsit félre érthető. A tömb alatt a számmal 0-tól indexelt hagyományos tömbre céloztam, illetve ennek átalakítására asszociatív tömbre. (JSON-re)
6

Attól tartok, amit te

bamegakapa · 2013. Júl. 14. (V), 17.05
Attól tartok, amit te JSON-nak hívsz, simán csak "objektum".
7

Kíváncsivá tettél.Attól

janez · 2013. Júl. 14. (V), 17.58
Kíváncsivá tettél.
Attól tartok, amit te JSON-nak hívsz, simán csak "objektum".


Én így hívom a JavaScript-ben azon objektumaimat amik a "var a = {};" formával hozok létre. Mellesleg több nyelven is keresztül haladnak ilyen formában.

Akkor elárulod mit tudok rosszul?

Szerk: Eközben már sejtem, hogy mire gondolsz.
Az JSON szabványára, mint dupla idézőjelekre a kulcsoknál?
8

JSON = JavaScript Object Notation

MadBence · 2013. Júl. 14. (V), 18.01
A JSON (JavaScript Object Notation) objektumok többé-kevésbé megegyeznek a "sima" JavaScript objektum literálokkal (a JSON érvényes JavaScript literál, de fordítva nem feltétlenül igaz).

(Oké, ez nem teljesen igaz, de foglalkozzon ezzel az, akinek két anyja van...)
9

A {} az úgynevezett "object

bamegakapa · 2013. Júl. 14. (V), 18.06
A {} az úgynevezett "object literal notation", gyorsan hozhatsz létre vele szimpla objektumokat (az Object-ből örökölnek). Az alábbi két forma teljesen ugyanaz:
var a = {};
//illetve
var a = new Object();
Ugyanígy van "array literal" is, a [], ami meg a new Array() formával ekvivalens.

A JSON pedig egy erre a két Javascriptes shorthand jelölésre épülő adatátviteli formátum. A JSON-ban nem feltétlenül fogsz találni {} jeleket, ez például érvényes JSON: [1, true, null]. A JSON előnye, hogy egy az egyben érvényes Javascript kód is.
10

Siettem, ránéztem válaszolni

janez · 2013. Júl. 17. (Sze), 20.21
Siettem, ránéztem válaszolni meg elfelejtettem.

Köszönöm az információkat.
Azzal tisztában voltam, hogy adatátviteli formátum. Az is megvolt, hogy lehet, csak tömb. Ahogy írtad is vissza fele kompatibilitás miatt nekem ráragadt a neve. :)

Igazatok van, hogy rossz néven hivatkozok a rossz helyen.
Ezek alapján a példában az érkező adat az "JSON" volt, továbbiakban is JSON szándékoztam tovább küldeni. De ha így nézzük a transzformálás maga még nem az.
Köszönöm az észrevételeket.
2

A különbség

vbence · 2013. Júl. 13. (Szo), 13.27
Nekem ez azt mondja, hogy a tömb valójában egy láncolt listaként van tárolva. Így az n-edig elemhez való hozzáféréshez végig kell menni az egész láncon n-ig. Ezzel szemben a shift mindig az első elemhez fér hozzá.

Persze az eltávolításnak is van költsége, de az lényegében csak egyetlen írással több. A memória menedzselése pedig általában aszinkron módon történik.

A böngészőfüggő adatokból arra gondolok, hogy NAGY tömbök esetén a Chrome átvált valódi indexelt tömbként való tárolásra, ahol természetesen az index alapján történő lookup a gyorsabb (és az első elem leemelési költsége nagy).

A FF alapból is tömbbel dogozhat.