2014-08-28 3 views
0

Я учусь JS и мне нужна помощь со следующей задачей:Как создать функцию, которая возвращает функцию и разбивает файл csv?

Мне нужно создать function compile_csv_search(text, key_name), который анализирует текст в формате CSV. (Не требуется обрабатывать цитирование и избежать значений; предположат значение поля не содержат запятые или другие специальные символы.)

Функция должна возвращать функцию, которая выглядит рекорд по значению поля, указанное в второй аргумент compile_csv_search. Предположим, что все значения в ключевом поле уникальны.

Пример использования:

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"} 

неопределенными

** Я не понимаю, что это значит "функции, которые возвращают функции". Как функция может возвращать другую функцию?

Спасибо!


P.S. прикрепление моего решения для обзора

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

Читайте: http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – user2864740

+2

Ниже приведен пример функции, возвращающей функцию: 'function foo (name) {return function() {console.log (имя); }; }; Foo ('бар')(); '. Функции - это объект, поэтому они могут быть переданы и возвращены из функций. –

+0

Обязательно отделите общую задачу от проблемы/проблемы. Разбор CSV является лишь второстепенной задачей (задача) и не связан с пониманием закрытий или постановкой проблемы (проблема). – user2864740

ответ

2

Функция в JavaScript являются объектами; они могут ссылаться на переменные, переданные в качестве аргументов и возвращенные из функций, подобных любому другому объекту.

Вот функция, которая возвращает объект:

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

А вот функция, которая возвращает другую функцию:

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

    return result; 
} 

Обратите внимание, как они действительно похожи - объект, возвращаемый первой функции простой объект, созданный с использованием синтаксиса литерала объекта ({}), а объект, возвращаемый вторым, является функцией.

Вы могли бы назвать внутренней, возвращаемый функцией, как это:

var out = returnFunction(); 
out(); 

Или даже returnFunction()();

Однако, вы не можете просто позвонить result() - result определяется только внутри returnFunction. Единственный способ получить доступ к нему извне - это получить его, вызвав внешнюю функцию.

0

Нечто подобное было бы хорошо:

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; 
      } 
     } 
    } 
} 

Также см эту скрипку: http://jsfiddle.net/efha0drq/

Вы всегда можете обращаться с той же функцией, как и любой другой JS объектов. Присвоить переменную, перейти к функции, сохранить в массиве ... все в порядке.

Магия в этом примере состоит в том, что вы можете читать/записывать переменные, определенные в функции compile_csv_search() в возвращаемой функции. Таким образом, можно хранить что-то в локальных переменных определяющей функции, а затем извлекать из возвращаемого, даже когда функция определения завершила выполнение давно. Возможно, вы слышали о «закрытии», верно?

+0

Спасибо, ты помог мне LOT Я бы хотел чтобы приложить мое собственное решение для вашего обзора, но я не знаю, как он может это сделать здесь –

+0

@AimeeMi Вы можете либо изменить свой вопрос, чтобы приложить свое решение, а затем @ me, или напишите мне по адресу i [at] tshen.im. –

Смежные вопросы