Създавайте обект в движение от CSV

Това, което се опитвам да направя, е да създам обектен литерал в движение с динамични свойства.

Имам масив, съдържащ съдържанието (CSV формат) на файл.

Всеки елемент е един ред (съдържанието беше разделено с /\r?\n/).

Първият елемент (първият ред) на този масив съдържа параметрите, които искам да имам за моя обектен литерал, разделени със запетаи.

Всички останали елементи са стойности (все още CSV формат) на параметрите, зададени в първия ред.

Кодът, който имам в момента, е следният:

function jsonDataArray(array) {
    var jsonResult = [],
        parameters = [],
        values;
    for(var i=0; i < array.length; i++) {
        if(i === 0) {
            var parameters = array[i].split(',');
            var objJSON = {};
            for(var k=0; k < parameters.length; k++) {
                objJSON.eval(parameters[k]);
            }
            continue;
        }
        values = array[i].split(',')
        for(var j=0; j < objJSON.length; j++) {
            objJSON[j] = values;
        }
        jsonResult.push(objJSON);
    }
    return jsonResult;
}

Сега, когато стартирам този код във възел, редът objJSON.eval(parameters[k]) изглежда е този, в който е проблемът, но не можах да разреша проблема.

Така че основно въпросите ми са следните:

  • Как трябва да продължа, за да задам параметрите от първия ред като параметри на JSON обект + да попълня стойностите на другите редове в?

  • Безопасно ли е да анализирате нови редове с това: /\r?\n/?

Благодаря ви предварително за помощта!

РЕДАКТИРАНЕ: Погрешно използвах термина JSON за означаване на обектен литерал, така че коригирах въпроса. Въпреки това не модифицирах функцията, за да не добавя грешки в кода по погрешка.


person m_vdbeek    schedule 02.08.2012    source източник
comment
Това не е JSON, това е просто обект на javascript   -  person zerkms    schedule 03.08.2012
comment
Съжалявам, грешно съм разбрал термина. Редактирах въпроса си.   -  person m_vdbeek    schedule 03.08.2012
comment
JSON е низ, който представлява javascript обект. какво точно се опитваш да постигнеш с тази линия? objJSON.eval(parameters[k]);   -  person dqhendricks    schedule 03.08.2012
comment
Опитвам се да създам свойство за обекта „objJSON“. Това свойство трябва да се наименува като стойността на елемента k в параметрите на масива.   -  person m_vdbeek    schedule 03.08.2012


Отговори (3)


Струва ми се, че искате масив от обекти, като всеки обект има ключове от първия ред (заглавки).

Следният код предполага, че вече сте разбили csv във всеки ред чрез \r?\n

(function() {
  var csv = [];
      csv.push('name,age,gender');
      csv.push('jake,13,m');
      csv.push('sarah,15,f');
      csv.push('john,18,m');
      csv.push('nick,13,m');

  console.log(csv);

  function jsonDataArray(array) {
    var headers = array[0].split(',');
    var jsonData = [];
    for ( var i = 1, length = array.length; i < length; i++ )
    {
      var row = array[i].split(',');
      var data = {};
      for ( var x = 0; x < row.length; x++ )
      {
        data[headers[x]] = row[x];
      }
      jsonData.push(data);

    }

    return jsonData;
  }

  console.log(jsonDataArray(csv));


})();

http://jsbin.com/igiwor/2/edit

Това ще произведе нещо като следното:

[{ name="jake",  age="13",  gender="m"},
{ name="sarah",  age="15",  gender="f"}, 
{ name="john",  age="18",  gender="m"},
{ name="nick"  age="13",  gender="m"}]
person travis    schedule 02.08.2012
comment
Благодаря ви много за този код! Мисля, че използва точно това, което Хоган се опитваше да ми обясни. Още веднъж благодаря за бързия отговор! - person m_vdbeek; 03.08.2012

Ето моята функция за анализ на CSV, надявам се да помогне:

function parseCSV(input) {
    var rows = input.split(/\r?\n/);
    var keys = rows.shift().split(",");
    return rows.map(function(row) {
        return row.split(",").reduce(function(map, val, i) {
            map[keys[i]] = val;
            return map;
        }, {});
    });
}

Как трябва да продължа, за да задам параметрите от първия ред като параметри на JSON обект + да попълня стойностите на другите редове?

Просто прегледайте стойностите. Тогава ключът, като values[i] се добавя към object, е parameters[i]. В моята версия това е редът map[keys[i]] = val;

Безопасно ли е да анализирате нови редове с това: /\r?\n/?

Мисля, че да.

person Bergi    schedule 02.08.2012
comment
Благодаря Ви за отговора ! Особено относно безопасността на /\r?\n/ сплит. Вашата функция за анализ на CSV е подобна на това, което travis предлагаше, така че благодаря и на вас. - person m_vdbeek; 03.08.2012
comment
Същото е, само че е написано по-кратко с карта и намаляване :-) - person Bergi; 03.08.2012

Мисля, че можете просто да кажете следното, но не съм сигурен какво трябва да бъде <somevalue>.

      objJSON[parameters[k]] = <somevalue>;

Във всеки случай помислете за следното,

var anObj = {};

anObj["a1"] = "sam";
anObj["a2"] = 5;

Това е същото като

var anObj = { a1 : "sam", a2 : 5 };
person Hogan    schedule 02.08.2012
comment
Ще се опитам да направя директно objJSON[параметри[k]] - person m_vdbeek; 03.08.2012