我试图将下面的数据结果创建为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
我们可以从你的原始数据开始,写一个函数,把一个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)
)
但这种格式对我来说意义不大,至少作为一种传输格式。 如果没有别的原因,它是相当多余的。
我怀疑你有一个问题,你没有你以为的标签。 程序员的文本编辑器经常被配置成用空格代替制表符,这可能是这里发生的事情。 例如,你粘贴到问题中的内容不包括制表符。
我建议你尝试修复你的输入问题,使用更像原始答案的东西。 这是对一些奇怪数据的变通方法,很可能是你的开发显示过程中的人为因素,而不是什么根本性的问题。