Node.js — Javascript — Разбор файла на вложенные объекты

Я новичок в Javascript, и у меня возникли проблемы с функцией, которую я написал. Я использую array.reduce() для выполнения задания, но в Windows он не работает (тестирование на Mac работает нормально).

Файл, который у меня есть, отформатирован следующим образом:

ford.car.focus.transmission=standard
ford.car.focus.engine=four-cylinder
ford.car.focus.fuel=gas

ford.car.taurus.transmission=automatic
ford.car.taurus.engine=V-8
ford.car.taurus.fuel=diesel

purchased=Ford Taurus

Я хотел бы, чтобы структура выглядела так:

{ ford:
  { car:
    { focus:
      {
        transmission: 'standard',
        engine: 'four-cylinder',
        fuel: 'gas'
      }
    }
    { taurus:
      {
        transmission: 'automatic',
        engine: 'V-8',
        fuel: 'diesel'
      }
    }
  }
  purchased: 'Ford Taurus'
}

Я храню строки файла в массиве, разбивая на '\n'. Я пытаюсь написать метод, который будет вызываться в цикле, передавая мой глобальный объект следующим образом:

var hash = {};
var array = fileData.toString().split("\n");
for (i in array) {
  var tmp = array[i].split("=");
  createNestedObjects(tmp[0], tmp[1], hash);
}

Моя текущая функция выглядит так:

function create_nested_object(path, value, obj) {
  var keys = path.split('.');
  keys.reduce(function(o, k) {
    if (k == keys[keys.length-1]) {
      return o[k] = value;
    } else if (o[k]) {
      return o[k];
    } else {
      return o[k] = {};
    }
  }, obj);
}

Я хотел бы превратить это в цикл for. У меня есть новый код, который выглядит так (я пытался преобразовать код array.reduce()):

function create_nested_object(path, value, obj) {
  var keys = path.split('.');

  for (var i = 0; i < keys.length; i++) {
    if (keys[i] == keys[keys.length-1]) {
      obj[keys[i]] = value;
    } else if (obj[keys[i]] == keys[i]) {
      obj;
    } else {
      obj = obj[keys[i]] = {};
    }
  }
}

Но он возвращает только последние элементы в каждом гнезде:

{
  "ford": {
    "car": {
      "taurus": {
        "fuel": "diesel"
      }
    }
  },
  "purchased": "Ford Taurus"
}

Я знаю, что что-то упускаю, но не могу понять, что не так. Любая помощь будет оценена по достоинству!

Связанный вопрос: Javascript — анализ файла INI во вложенный ассоциативный массив


person jbmoon    schedule 19.04.2016    source источник
comment
Почему бы не хранить ваши данные в формате, в котором есть существующие методы синтаксического анализа, такие как JSON (во всяком случае, почти то, что у вас есть сейчас)? Нет необходимости изобретать собственный формат данных. В любом случае это может иметь какое-то отношение к концам строк, которые вы разбиваете, которые различаются в разных ОС (хотя я далеко не эксперт в этом).   -  person Marty    schedule 20.04.2016
comment
@Марти прав. В Windows вам нужно будет использовать \r\n.   -  person It-Z    schedule 20.04.2016
comment
Мне нужно использовать этот формат файла, потому что он подключается к устаревшему приложению.   -  person jbmoon    schedule 20.04.2016
comment
Ах, это несчастье.   -  person Marty    schedule 20.04.2016


Ответы (2)


РЕДАКТИРОВАТЬ, чтобы использовать os.EOL

решение в комментариях: В коде OP:

var array = fileData.toString().split("\n");

И, как предложил @Marty, должно быть:

var array = fileData.toString().split(os.EOL);

В Windows.

person Community    schedule 20.04.2016

Ответ EOL хороший, поэтому я даю ему голос. В ответ на мой вопрос о том, почему моя функция не работала, я сказал, что это не имеет никакого отношения к Windows. Проблема заключалась в том, что файл на компьютере с Windows имел дублирование ключей, что приводило к сбою функции.

ford.car.focus.transmission=standard
ford.car.focus.engine=four-cylinder
ford.car.focus.engine.type=big
ford.car.focus.fuel=gas

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

Спасибо всем за ответы!

person jbmoon    schedule 27.04.2016