Javascript NodeJS:将表字符串(带\n\r和\t)转换为JSON

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

我有来自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' },
  { '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',)
    或其他什么?