В чем может быть ошибка при написании функции?

Довелось решать тестовое задание на JavaScript. Задача была в реализации функции парсинга CSV:
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",
    "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"}
undefined

(The return values are objects, not strings.)

Мое решение задачи выглядело следующим образом:
function compile_csv_search(text, byField) {
        var text = text.split('\n'),
                headers = text[0].split(','),
                byIndex = 0;

        $.each(headers, function (index, field) {
            if (field == byField)
                byIndex = index;
        });
        text.shift();
        text.pop();

        return function (needle) {

            var curEl = '',
                    result = {};
            $.each(text, function (i, element) {
                curEl = element.split(',');
                if (curEl[byIndex] == needle) {
                    $.each(headers, function (index, header) {
                        result[ headers[index] ] = curEl[index];
                    });
                    return;
                }
            })
            return result;
        }
    }

Решение было расценено как недостаточно качественное. Помогите, пожалуйста, разобраться в причинах такой оценки, так как ответа от работодателя я не смог получить.
  • Вопрос задан
  • 2276 просмотров
Решения вопроса 1
Rrooom
@Rrooom
- Зачем использовать jQuery?
- добавить бы ленивости, что бы функция лишь по требованию парсила данные
- Плохое знание библиотеки языка
a. Первый цикл заменяется на indexOf
b. шифт-поп... Некрасиво, есть же срезы.
- Самый ужас в самой возвращаемой функции! Зачем-зачем!? Каждый раз бегать в циклах? Да ладно в циклах, вы результат даже не кэшируете! Либо на момент первого запроса полностью распарсите данные в объект, либо его постепенно напоняйте по мере обращения к элементам.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Jeiwan
@Jeiwan
Мое мнение: у вас отсутствует структура в коде. При вызове compile_csv_search мы передаем какие-то данные, в которых нам потом нужно будет искать, значит логично было бы организовать какое-то хранилище. При вызове csv_by_name нам нужно искать по этому хранилищу. Вот, набросал на коленке свой вариант:
function compile_csv_search(csv, field) {
  csv = csv.split("\n")
  var h = csv.shift().split(",");
  var res = [];

  for (var i = 0; i < csv.length; i++) {
    var obj = {};
    for (var j = 0; j < h.length; j++) {
      obj[h[j]] = csv[i].split(",")[j];
    }
    res.push(obj);
  }

  return function(id) {
    for (var i = 0; i < res.length; i++) {
      if (res[i][field] === id) {
        return res[i];
        break;
      }
    }
  };
};

Ну и нужно сделать проверки на передаваемые в функции параметры.

Работодателя могло и отпугнуть то, что вы используете jquery для циклов — действительно, странное решение.
Ответ написан
Комментировать
@personaljs
Заметно плохое знание языка, как заметили выше. Просто еще одн пример :
var parserCSV = function (string, field){
	var parseString = string.split(/\n/),
		attrs = parseString.shift().split(',');

	var models = parseString.map(function (item) {
		var result = {};
		item.split(',').forEach(function (value, index){
			result[attrs[index]] = value;
		});
		return result;
	});

	return function (value) {
		return models.filter(function (model) {
			return model[field] === value;
		}).shift();
	};
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы