2014-08-28 4 views
0

j'apprends JS et je besoin d'aide à la tâche suivante:Comment créer une "fonction qui retourne une fonction et divise le fichier csv"?

Je dois créer un function compile_csv_search(text, key_name) qui parse texte dans format CSV. (Non requis pour gérer guillemets et les échappements des valeurs, prennent des valeurs de champ ne contiennent jamais des virgules ou autres caractères spéciaux.)

doit retourner une fonction qui recherche un enregistrement d'une valeur du champ spécifié comme le second argument de compile_csv_search. Supposons que toutes les valeurs dans le champ clé sont uniques.

Exemple d'utilisation:

var csv_by_name = compile_csv_search(
    "ip,name,desc\n"+ 
    "1.94.0.2,server1,Main Server\n"+ 
    "1.53.8.1,server2,Backup Server\n", 
    "name"); 
console.log(csv_by_name("server2")); 
console.log(csv_by_name("server9")); 

...will print: 

{ip: "10.52.5.1", name: "server2", desc: "Backup Server"} 

non définie

** Je ne comprenais pas ce que cela signifie "fonction qui renvoie la fonction". Comment la fonction peut-elle retourner une autre fonction?

Merci!


P.S. attachaient ma solution pour votre avis

function compile_csv_search(csvServerData){ 
    var header = csvServerData.split('\n')[0].split(","); 
    var spleatedServerData = csvServerData.split('\n'); 
    return function(serverName) 
    { 
    for(var i = 1; i < spleatedServerData.length; i++){ 

     var singleServer = spleatedServerData[i].split(',') 
     var result = {}; 
     var exist = false; 
     for (var j = 0; j < header.length; j++) { 
      if(singleServer.indexOf(serverName) == -1) 

       break; 

       exist = true; 
      result[header[j]] = singleServer[j]; 
     } 
     if(exist){ 
     return(result); 
     break; 
     } 

    } 
} 
} 
var csv_by_name = compile_csv_search(
    "ip,name,desc\n"+ 
    "10.49.1.4,server1,Main Server\n"+ 
    "10.52.5.1,server2,Backup Server\n"); 
+0

Lire: http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – user2864740

+2

Voici un exemple de fonction qui retourne une fonction: 'function foo (name) {return function() {console.log (nom); } } foo ('bar')(); '. Les fonctions sont objet, donc elles peuvent être passées et renvoyées par des fonctions. –

+0

Veillez à séparer la tâche générale du problème/problème. L'analyse du CSV n'est qu'une préoccupation secondaire (la tâche) et non liée à la compréhension des fermetures ou à l'énoncé du problème (le problème). – user2864740

Répondre

2

Fonctions JavaScript sont des objets; ils peuvent être référencés par des variables, passés en arguments et retournés par des fonctions comme n'importe quel autre objet.

est ici une fonction qui retourne un objet:

function returnObject() { 
    var result = { a: 1, b: 2, c: 3 }; 
    return result; 
} 

Et voici une fonction qui retourne une autre fonction:

function returnFunction() { 
    var result = function() { 
    console.log('another function!'); 
    } 

    return result; 
} 

Remarquez comment ils sont vraiment similaires - objet retourné par la première fonction est un objet brut créé à l'aide de la syntaxe littérale d'objet ({}) et l'objet renvoyé par le second est une fonction.

Vous pourriez appeler l'intérieur, fonction comme ceci retour:

var out = returnFunction(); 
out(); 

Ou encore returnFunction()();

Cependant, vous ne pouvez pas appeler result() - seulement result est définie à l'intérieur de returnFunction. La seule façon d'y accéder depuis l'extérieur est de le récupérer en appelant la fonction externe.

0

Quelque chose comme ça serait bien:

function compile_csv_search(text, key_name) { 
    var lines = text.split('\n'); 
    var keys = lines[0].split(','); 
    var key_index = keys.indexOf(key_name); 
    return function(value) { 
     for(var i = 1; i<lines.length; i++) { 
      current_line_values = lines[i].split(','); 
      if(current_line_values[key_index] === value) { 
       var result = {}; 
       for(var j = 0; j<keys.length; j++) { 
        result[keys[j]] = current_line_values[j]; 
       } 
       return result; 
      } 
     } 
    } 
} 

Voir aussi ce violon: http://jsfiddle.net/efha0drq/

Vous pouvez toujours traiter une même fonction que les objets de tout autre. Affecter à une variable, passer à une fonction, stocker dans un tableau ... tout va bien.

La magie dans cet exemple est que vous pouvez lire/écrire les variables définies dans la fonction compile_csv_search() dans la fonction retournée. Il est donc possible de stocker quelque chose dans les variables locales de la fonction de définition, et de récupérer plus tard celui qui a été renvoyé, même lorsque la fonction de définition a fini d'exécuter il y a longtemps. Vous avez peut-être entendu parler de "fermeture", n'est-ce pas?

+0

Merci à tous, vous m'avez aidé BEAUCOUP Je voudrais pour joindre ma propre solution pour votre revue, mais je ne sais pas comment le faire ici –

+0

@AimeeMi Vous pouvez soit éditer votre question pour attacher votre solution et puis @ moi, ou envoyez-moi un courriel à i [at] tshen.im. –

Questions connexes