2012-04-27 19 views
5

Dai uno sguardo allo snippet qui sotto. C'è qualche funzione che potrei scrivere in sostituzione di ... per generare il percorso, che potrebbe essere riutilizzato in un'altra funzione? Qualcosa come var route = this.show.fullyQualifiedName forse?JavaScript: ottenere il nome completo della funzione dall'interno?

var services = { 
    'github.com': { 
     api: { 
      v2: { 
       json: { 
        repos: { 
         show: function(username, fn) { 
          var route = ...; 
          // route now == 'github.com/api/v2/json/repos/show' 

          route += '/' + username; 

          return $.getJSON('http://' + route).done(fn); 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

Non penso che sia possibile una ricerca top-down. Come farà la ricerca a sapere quando avrà trovato la sua corrispondenza a meno che non abbia fornito il percorso completo di 'show'? E se l'ho fornito con il percorso completo di 'show', che sconfigge il punto di utilizzo di una singola funzione o ottiene i valori di' route' da qualsiasi metodo come 'show' I define. – barfoo

+0

dovresti riempire ricorsivamente l'albero (solo una volta) _prima_ sempre chiamando la funzione. – Alnitak

risposta

3

No, non c'è, almeno non usando le operazioni in stile "riflesso".

Gli oggetti non conoscono il nome degli oggetti in cui sono contenuti, non ultimo perché lo stesso oggetto (riferimento) potrebbe essere contenuto all'interno di di molti oggetti.

L'unico modo per farlo sarebbe quello di cominciare l'oggetto superiore e il tuo lavoro verso l'interno, per es .:

function fillRoutes(obj) { 
    var route = obj._route || ''; 
    for (var key in obj) { 
     if (key === '_route') continue; 
     var next = obj[key]; 
     next._route = route + '/' + key; 
     fillRoutes(next); 
    } 
} 

che metterà un nuovo _route proprietà a ciascun oggetto che contiene il percorso di quell'oggetto.

Vedi http://jsfiddle.net/alnitak/WbMfW/

1

Non si può fare una ricerca ricorsiva, come Alnitak detto, ma si potrebbe fare una ricerca top-down, anche se potrebbe essere un po 'lento a seconda delle dimensioni del vostro oggetto. Passare in rassegna le proprietà dell'oggetto, controllando se ha figli. Se ha un figlio, passa attraverso quello, ecc. Quando raggiungi la fine di una catena e non hai trovato la tua funzione, passa al figlio successivo e continua la ricerca.

Non ho il tempo di scrivere un esempio ora, ma spero che tu possa mettere insieme qualcosa da questo.

Problemi correlati