2016-02-04 231 views
0

我有數據出來,看起來像這樣的API的:的NodeJS:轉換表的字符串(含 n r和 T)以JSON

'Type1\tCode\tPrice\tQuantity\r\n4X-US0U-R114\tB004P2NG0K\t37.99\t15\r\nGC-NP0Y-XPOA\tB007KAYCGQ\t150.00\t4\r\nRL-E0ZD-16G1\tB016FWZDO4\t28.00\t\r\n' 

我怎麼能轉換成JSON嗎? (我使用的,如果有任何簡單的方法,這種的NodeJS)

我的第一個想法是,以取代製表符,然後運行輸出到節點的csvtojson,如:

var str = 'Type1\tCode\tPrice\tQuantity\r\n4X-US0U-R114\tB004P2NG0K\t37.99\t15\r\nGC-NP0Y-XPOA\tB007KAYCGQ\t150.00\t4\r\nRL-E0ZD-16G1\tB016FWZDO4\t28.00\t\r\n' 
str = str.replace(/\t/g, ' '); 

converter.fromString(data, function(err,result){ 
     console.log(result); 
});  

然而,這個結果在格式不正確的數據,如下:

[ { 'type code price quantity': '4X-US0U-R114 B004P2NG0K 37.99 15' }, 
    { 'type code price quantity': 'GC-NP0Y-XPOA B007KAYCGQ 150.00 4' }, 
    { 'type code price quantity': 'RL-E0ZD-16G1 B016FWZDO4 28.00' } ] 

我在做什麼錯在這裏?

+0

什麼是最終的輸出?二維數組?數組與對象? – epascarello

+0

@epascarello編輯它到我的帖子 – Jascination

+0

似乎很奇怪,想要它那樣... – epascarello

回答

2
  1. 所以它基本上是一個分裂得到行。
  2. 刪除第一行獲得冠軍
  3. 比環比行
  4. 其拆分成細胞
  5. 並逐一細胞,並將它們psuh成一個對象
  6. 並把對象變成一個數組

的基本思想:

var str = 'Type1\tCode\tPrice\tQuantity\r\n4X-US0U-R114\tB004P2NG0K\t37.99\t15\r\nGC-NP0Y-XPOA\tB007KAYCGQ\t150.00\t4\r\nRL-E0ZD-16G1\tB016FWZDO4\t28.00\t\r\n' 
var rows = str.split(/\r\n/g); 
var title = rows.shift().split(/\t/g); 
var altered = rows.reduce(function(arr, cur) { 
    var x = {}; 
    if(cur.length){ 
     var parts = cur.split(/\t/g);  
     parts.map(function(v,i){ 
      x[title[i]] = v; 
     }); 
     arr.push(x); 
    } 
    return arr; 
}, []); 
+0

因爲在OP我使用節點,而不是jQuery,所以'$ .trim()'不會在這裏工作 – Jascination

+0

左邊那個錯誤,當調試時,我有一個額外的索引 – epascarello

+0

很酷。在Node中,這會在每個對象的'quantity'屬性中留下'\ r',這似乎不會在控制檯中發生。可能需要一個簡單的'.replace(/ \ r/g,'')'或其他東西? – Jascination

2

您可以通過\n\r\t然後地圖分割你的陣列/酌減:

var data = 'Type1\tCode\tPrice\tQuantity\r\n4X-US0U-R114\tB004P2NG0K\t37.99\t15\r\nGC-NP0Y-XPOA\tB007KAYCGQ\t150.00\t4\r\nRL-E0ZD-16G1\tB016FWZDO4\t28.00\t\r\n'; 

var arr = data.trim().split('\r\n').map(function(row) { 
    return row.split('\t'); 
}); // 2 - dimensional array 

var headers = arr.shift(); // first row are table headers 

var result = arr.map(function(row) { 
    return row.reduce(function(obj, cell, i) { 
     obj[headers[i]] = cell; 
     return obj; 
    }, {}); // map each row to object with headers as keys 
}); 

console.log(result); 

的輸出形式:

[ 
    { 
     'Type1': '4X-US0U-R114', 
     'Code': 'B004P2NG0K', 
     'Price': '37.99', 
     'Quantity': '15' 
    }, 
    { 
     'Type1': 'GC-NP0Y-XPOA', 
     'Code': 'B007KAYCGQ', 
     'Price': '150.00', 
     'Quantity': '4' 
    }, 
    // ... 
] 
+0

啊,非常聰明。 +1因爲沒有讓我依賴CSV轉換器! – Jascination

+0

其實,這有一個錯誤 - 最後一個對象是畸形的 – Jascination

+0

@Jascination對,我忘了修剪數據。看到更新 – madox2