Javascript NodeJS:将表字符串(带\n\r和\t)转换为JSON
我有来自API的数据,如下所示:Javascript NodeJS:将表字符串(带\n\r和\t)转换为JSON,javascript,json,node.js,Javascript,Json,Node.js,我有来自API的数据,如下所示: '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' [ { 'type code price quantity': '4X-US0U-R114 B004P2NG0K 37.99 15' }, { 't
'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'
[ { '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' } ]
如何将其转换为JSON?(如果有任何简单的方法,我将使用NodeJS)
我的第一个想法是替换制表符,然后将输出运行到节点中,如:
但是,这会导致数据格式错误,如下所示:
'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'
[ { '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' } ]
我做错了什么?您可以按
\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'
},
// ...
]
您可以按
\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'
},
// ...
]
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;
}, [] );
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;
}, [] );
最终输出是什么?二维阵列?带对象的数组?@epascarello将其编辑到我的帖子中,想要这样似乎很奇怪…@epascarello我不想要这样!这就是CSV转换器当前输出的内容。您想要的最终输出是什么??这就是我想弄明白的,这样我可以帮助你。最终的结果是什么?二维阵列?带对象的数组?@epascarello将其编辑到我的帖子中,想要这样似乎很奇怪…@epascarello我不想要这样!这就是CSV转换器当前输出的内容。您想要的最终输出是什么??这就是我想弄明白的,我可以帮你。啊,非常聪明+感谢我没有让我依赖CSV转换器!实际上,这有一个错误-最后一个对象是malformed@Jascination对,我忘记整理数据了。看啊,很聪明+感谢我没有让我依赖CSV转换器!实际上,这有一个错误-最后一个对象是malformed@Jascination对,我忘记整理数据了。请参阅我正在使用的OP节点中的updateAs,而不是jQuery,因此
$.trim()
在此不起作用。在调试时,当我有一个额外的indexCool时,错误地将其保留在这里。在节点中,这会将\r
保留在每个对象的quantity
属性中,这似乎不会在控制台中发生。可能需要一个简单的.replace(/\r/g,”)
或其他什么?因为在OP中,我使用的是Node,而不是jQuery,所以$.trim()
在这里不起作用。在调试时,当我有一个额外的indexCool时,错误地将它保留了下来。在节点中,这会将\r
保留在每个对象的quantity
属性中,这似乎不会在控制台中发生。可能需要一个简单的。替换(/\r/g',)
或其他什么?