formato di array (Javascript)

0

Ho una lista di utenti, con minion, qualcosa del genere:

User52:
       minion10
       minion12
User32:
      minion13
      minion11

Ho tenuto un array in cui la "posizione" è l'id, come questo:

Users:
       [52]User
               minions:
                       [10]minion
                       [12]minion
       [32]User
               minions:
                       [13]minion
                       [11]minion

quindi posso accedervi facilmente in questo modo: user[UserID].minions[MinionID] (ex: user[32].minions[11] ).

Ma quando lo stampo o lo mando da JSON, ho qualcosa del genere:

{,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,minion,,,,,,,,,,,,,,minion}

Ma dovrei continuare a usare in questo modo o dovrei passare a qualcosa del genere:

User = function(){
   this.minions = ...;
   this.getMinion = function(value){
     for(var m in this.minions){
      if(this.minions[m].id == value){
         return this.minions[m];
         break;
      }
     }
   } 
}

e prendilo in questo modo:

user.getMinion(MinionID);

Domanda: ottengo prestazioni migliori usando un array "corto" ma usando loop ogni volta che ho bisogno di un seguace, o usando array "lunghi", ma non ho bisogno di loop e di ottenere valori direttamente dall'ID "nome"?

    
posta Joaolvcm 19.06.2012 - 16:58
fonte

2 risposte

2

Mr. Melo solleva una buona domanda per JavaScript Object Access Pattern. Lascio la precedente risposta "introduttiva" affinché gli altri interpretino il tuo codice.

La mia risposta è sovrascrivere un metodo di stampa, e un altro modo, per convertire i dati in una traduzione di dati leggibile dall'uomo.

quando lo stampi o lo invii per json ottieni un output non sensato:

{,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,minion,,,,,,,,,,,,,,minion}

Ecco dove posso dare un suggerimento. Quello che vedete sopra è l'Object-Literal convertito in stringa. Può essere annidato in un metodo JSON.stringify () o in un altro esempio di toString (). Puoi migliorare questo con due potenziali soluzioni a seconda del tuo contesto.

Un metodo ToString Override. - Una soluzione è quella di scavare nella funzione (step-debug) 'down-into' nel metodo che converte il tuo oggetto in String, e copiarlo, rinominarlo e cambiarlo in yourOwnStringifyMethod (). Questo è essenzialmente un override del metodo toString (). Invece di stampare

","+","+","+data+",",

sostituiscilo per stampare qualcos'altro. Chiamalo minion.minionToString () o qualcosa del genere.

Gli indici possono essere facilmente inseriti nell'iteratore per produrre:

{0,1,2,data,...}

Oppure stampa l'id di un seguace stampando i membri dei dati come +minion.name+ . Cercare override di toString, questo sarebbe forse l'ideale, se stai trasferendo il JSON in modo asincrono o in tempo reale, e vuoi solo tradurre i dati.

B. Modelli. Se i dati devono essere visualizzati sullo schermo, anziché trasferiti, i dati li collegano da json a un modello. Il data-binding è ottimo. La sintassi è qualcosa come var arg = " <html>...<div><%data-field*></div></html>" Quindi, ad esempio, la invii in una funzione templ (arg) e sputa un var x = templ(htmltemplate, data-stream) . Var x è ora il tuo template-data-loaded-html da inserire nel dom.

Ci sono diversi modi per farlo.

C. Questa è un'interessante incarnazione del codice in cui suggerisci:

i've been keeping in an array where the "location" is the id

Questo mi ricorda in qualche modo CouchDB. CouchDB e Mongo sono database JavaScript, che utilizzano oggetti JSON persistenti nel tempo da un ID univoco lungo. Forse questo ti aiuterà ad evolvere un accessor e a mostrare le migliori pratiche.

D. Il ciclo di funzioni di ricerca sembra potenzialmente costoso per i set di dati molto grandi. Esistono alcuni algoritmi di indicizzazione e di ricerca che possono ridurre l'elaborazione delle iterazioni se si sta eseguendo un numero elevato di minion e si desidera ottimizzare la ricerca. Paul Irish ha scritto un libro, o carta, su 10 cose che ho imparato leggendo il codice sorgente di jQuery. Immagino che ci sia qualche frutto avanzato in merito all'efficiente traversamento del nodo dom, che potrebbe, almeno, essere illuminante per il tuo armamento di servitori.

Spero che aiuti. Ti auguro il meglio! Nash

    
risposta data 20.06.2012 - 06:22
fonte
1

Buona domanda. Questa è una confusione comune all'inizio.

Quello che stai vedendo è una sintassi diversa di due cose che si comportano allo stesso modo perché sono entrambi gli oggetti. Capirò esattamente perché questo è, ma prima chiarirò cosa è cosa:

In JavaScript,

Questa è una matrice:

var arrayExample[];

Questo è un oggetto letterale:

var jsObject = {};

Per rispondere alla tua domanda, dovresti utilizzare la definizione Array e la sintassi di accesso, quando l'intento è quello di utilizzare una matrice.

user[15] = USER;
for (var i in user){
  if(user[i].id == ID){
    user[i];
}

Detto questo, ci sono migliori framework per le operazioni di array. Uno è underscore.js. Ma consideralo solo se stai conducendo un gran numero di operazioni su array che potrebbero essere ottimizzate. Un'altra ottimizzazione è la jQuery foreach (), che vale la pena esaminare.

Poiché una matrice è un oggetto e poiché gli oggetti hanno una sintassi di ricerca di denominazione [], hanno un comportamento simile. Entrambi sono costrutti molto potenti, ma dovresti usarli così come sono intesi in modo che gli sviluppatori successivi possano facilmente interpretare le tue intenzioni.

Il comportamento si sovrappone tra oggetto e array, è in realtà una flessibilità molto potente del linguaggio che è comunemente frainteso.

Ecco un buon link , ma cercherò di renderlo semplice.

Un oggetto può accedere ai suoi membri attraverso questo nome, cerca la sintassi:

// Sembra un array, ma è un oggetto che accede a un valore membro, non un valore indice. var memberValue = jsObject ['member-name']

Essenzialmente gli array fanno la stessa cosa, solo con un numero invece di una stringa.

Ancora una volta, usa una matrice - quando hai bisogno di una matrice e di un oggetto - quando hai bisogno di un oggetto.

    
risposta data 19.06.2012 - 22:32
fonte

Leggi altre domande sui tag