2012-08-02 74 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