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

问题描述 投票:0回答:1

我试图将下面的数据结果创建为key-value对,我们如何使用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
javascript arrays regex split
1个回答
1
投票

我们可以从你的原始数据开始,写一个函数,把一个TSV字符串(带头)转换成一个对象数组。

这个 tsv2arr (略改自 早先的回答)通过首先修剪任何前导或尾部的空白,在新行上进行分割,并在制表符上分割每一行。 第一行的输出成为头字段名,其余的则通过取每个值并将其与同一索引的头字段配对而被还原成对象。 看起来像数字的值会被转换为数字;这可能会转换一些你不想转换的东西,但如果你需要改变它们,你可以再进行后处理。

代码相当简单。

const tsv2arr = (tsv) => {
  const [headers, ...rows] = tsv .trim () .split ('\n') .map (r => r .split ('\t'))
  return rows .reduce ((a, r) => [
    ... a, 
    Object .assign (... (r .map (
      (x, i, _, c = x.trim()) => ({[headers [i].trim()]: isNaN(c) ? c : Number(c)})
    )))
  ], [])
}

const tsv = `
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
2	ST-621973	8/9/20	02/10/16	First Class	XY-139  	Foobar Inc	Consumer	United States	Madison 	Wisconsin	53702   	Midwest	FUR-SO-10003869	Furniture	Sofas   	Tyler, Some Random Sofa Name    	963.85	1        	0        	265.89
3	MQ-169437	12/7/20	03/15/16	Second Class	CG-125  	Clay bute	Consumer	United States	Henderson	Kentucky	42420   	South	FUR-DE-10005309	Furniture	Desk    	Adams, Some Random Desks Name?  	654.13	1        	0        	143.28
`


console .log (
  tsv2arr (tsv)
)
.as-console-wrapper {min-height: 100% !important; top: 0}

编辑: 增加了一项 trim 的单元格。 这可能没有必要;这可能只是我将输入的格式化以排列标签的一个产物。 但很难想象它会伤害到任何东西,而且在某些情况下它可能会有帮助。 请注意,在源文本中有许多额外的空格,以使列在页面上正确地排列。 当然,它们是完全不相关的,而这个 trim 摆脱它们。

替代品

如果你真的想从这种输入格式入手,你可以写这样的东西。

const data = [
  {"Row ID	O ID	O Date	Ship Date	Ship Type": "1	PA-152156	11/9/20	01/19/16	Second Class"},
  {"Row ID	O ID	O Date	Ship Date	Ship Type": "2	ST-621973	8/9/2	02/10/16	First Class"}
]

const buildObj = (kv) =>
  Object .entries (kv) .map (([k, v]) => {
    const keys = k .split ('\t')
    const vals = v .split ('\t')
    return Object .assign (... keys .map ((k, i) => ({[k]: vals [i]})))
  })

console .log (
  data .flatMap (buildObj)
)

但这种格式对我来说意义不大,至少作为一种传输格式。 如果没有别的原因,它是相当多余的。

我怀疑你有一个问题,你没有你以为的标签。 程序员的文本编辑器经常被配置成用空格代替制表符,这可能是这里发生的事情。 例如,你粘贴到问题中的内容不包括制表符。

我建议你尝试修复你的输入问题,使用更像原始答案的东西。 这是对一些奇怪数据的变通方法,很可能是你的开发显示过程中的人为因素,而不是什么根本性的问题。

© www.soinside.com 2019 - 2024. All rights reserved.