2012-08-02 77 views
1

我正在尝试的是使用动态属性随时创建对象文字。从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意思是对象字面,所以我纠正了这个问题。我没有修改这个函数,所以我不会在代码中错误地添加错误。

+1

这不是'JSON',它只是一个javascript对象 – zerkms 2012-08-02 22:58:08

+0

对不起,我误解了这个词。我编辑了我的问题。 – 2012-08-02 23:02:49

+0

JSON是一个表示javascript对象的字符串。你想用这条线完成什么? 'objJSON.eval(parameters [k]);' – dqhendricks 2012-08-02 23:06:18

回答

2

在我看来,你想对象的数组,其从键的每个对象第一行(标题)。

下面的代码假设你已经通过\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

打破了CSV到每一行这将生成类似如下:

[{ name="jake", age="13", gender="m"}, 
{ name="sarah", age="15", gender="f"}, 
{ name="john", age="18", gender="m"}, 
{ name="nick" age="13", gender="m"}] 
+0

非常感谢你这个代码!我认为这正是Hogan试图向我解释的内容。再次感谢您的快速回答! – 2012-08-02 23:20:28

1

我想你可以只说下面,但我不确定<somevalue>应该是什么。

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

在任何情况下,请考虑以下,

var anObj = {}; 

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

这是一样的

var anObj = { a1 : "sam", a2 : 5 }; 
+0

我会尽量直接做objJSON [参数[k]] – 2012-08-02 23:17:59

3

这里是我的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/

我想是的。

+0

谢谢你的回答!特别是关于/ \ r?\ n/split的安全性。您的CSV解析功能与Travis提出的类似,所以也要感谢您。 – 2012-08-02 23:22:26

+0

这是一样的,只是用地图和缩小:-)写得较短 – Bergi 2012-08-02 23:40:25