Javascript 如何用包含字符串的对象构建数组?

Javascript 如何用包含字符串的对象构建数组?,javascript,arrays,regex,split,Javascript,Arrays,Regex,Split,我试图将下面的数据结果创建为键/值对,我们如何使用JS拆分功能实现这一任务在这里没有什么问题 main.js const data = [{ "Row ID O ID O Date Ship Date Ship Type": "1 PA-152156 11/9/20 01/19/16" } ] function buildArray(data) { for(item in arr) { let string = it

我试图将下面的数据结果创建为键/值对,我们如何使用JS拆分功能实现这一任务在这里没有什么问题

main.js

const data = [{
        "Row ID  O ID    O Date  Ship Date   Ship Type": "1   PA-152156   11/9/20 01/19/16"
    }

]
    function buildArray(data) {
      for(item in arr) {
      let string = item;
      let array  = string
      .replace(/" "\s/g, '####')
      .split(' ')
      .map(pair => {
        let split = pair.split('####');
        return { key: split[0], value: split[1] };
      });
     }
    }

console.log(buildArray(data));
预期产量

[{
    "Row ID": 1,
    "O ID": "PA-152156",
    "O Date": "11/9/20",
    "Ship Date": "01/19/16"
}]
tsvFile数据

Row ID  O ID    O Date  Ship Date   Ship Type   Customer ID Customer Name   Seg Country City    State   Zip Code    Region  Product ID  Category    Sub-Category    Product Name    Sales   Quantity    Discount    Profit
1   PA-152156   11/9/20 01/19/16    Second Class    CG-125  Clay bute   Consumer    United States   Henderson   Kentucky    42420   South   FUR-BO-10001798 Furniture   Bookcases   Bush, Somerset Collection Bookcase? 261.96  2   0   41.9136

我们可以从原始数据开始,编写一个函数,将TSV字符串(带标题)转换为对象数组

tsv2arr
(略为改动)通过首先修剪任何前导或尾随空格、在新行上拆分以及在制表符上拆分每行来实现。第一行的输出成为标题字段名,其余的字段名通过获取每个值并将其与相同索引处的标题配对而缩减为对象。看起来像数字的值被转换成数字;这可能会转换一些您不想转换的内容,但如果需要更改,您可以对其进行后期处理

代码相当简单:

const tsv2arr=(tsv)=>{
const[headers,…rows]=tsv.trim().split('\n').map(r=>r.split('\t'))
返回行。减少((a,r)=>[
A.
Object.assign(…(r.map(
(x,i,c=x.trim())=>({[headers[i].trim()]:isNaN(c)?c:Number(c)})
)))
], [])
}
常数tsv=`
行ID O ID O日期发货日期发货类型客户ID客户名称Seg国家/地区城市/州邮政编码地区产品ID类别子类别产品名称销售数量折扣利润
1 PA-152156 11/9/20 01/19/16二等CG-125粘土布特消费品美国亨德森肯塔基42420 South FUR-BO-10001798家具书架布什,萨默塞特收藏书架?261.96 2 0 41.9136
2 ST-621973 8/9/20 02/10/16一等XY-139 Foobar Inc消费品美国威斯康星州麦迪逊53702中西部毛皮-SO-10003869家具沙发泰勒,一些随机沙发名称963.85 1 0 265.89
3 MQ-169437 12/7/20 03/15/16二等CG-125粘土布特消费品美国亨德森肯塔基州42420 South FUR-DE-10005309家具桌亚当斯,一些随机桌名?	654.13	1        	0        	143.28
`
控制台日志(
tsv2arr(tsv)
)

作为控制台包装{min height:100%!important;top:0}
每个列标题之间是否有一组空格?如果是这样的话,你可以从中分离出来,但我最终发现这里的数据结构似乎非常脆弱。数据不能作为CSV输入吗?@coloradocolby我正在从tsv文件中读取数据,在上面的示例中,我以
data
的形式添加了一个数组,现在问的是如何构建键值对我如何创建您使用const tsv声明的字符串,我正在读取文件并将其转换为字符串
const tsvFileData=fs.readFileSync('./filename1.tsv');const tsvToStr=tsvFileData.toString();
及其抛出错误tsv.trim不是像
[{“行ID O ID O日期发货日期发货类型客户ID客户名称Seg国家/地区城市/州邮政编码地区产品ID类别子类别产品名称销售数量折扣利润”:”1 PA-152156 11/9/20 01/19/16二等CG-125粘土布特消费品美国亨德森肯塔基42420 South FUR-BO-10001798家具书架布什,萨默塞特收藏书架?261.96 2 0 41.9136“}]
我不知道你是如何得到这种奇怪的格式的。我不知道这是否有帮助:
fs.readFileSync('./filename1.tsv').toString('utf8'))
。如果没有,那么我不理解你的输入格式。但是中间格式非常糟糕。我们可以很容易地修改代码来处理它。但是如果有其他记录,它会是什么样子呢?我尝试了
toString
结果仍然是一样的,不确定它在你提供的代码段中是如何工作的,这就是我使用的格式e您将其分配给tsv的方式variable@hussain:我添加了另一个选项,这可能会有所帮助。但我认为问题更多地与输入中的选项卡有关。