Как построить массив из объекта, который содержит строку? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь создать приведенный ниже результат данных в виде пары ключ / значение, как мы можем решить эту задачу, используя 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 data

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

1 Ответ

1 голос
/ 24 апреля 2020

Мы могли бы начать с ваших исходных данных и написать функцию, которая преобразует строку 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)
)

Но этот формат имеет для меня очень мало смысла, по крайней мере, в качестве транспортного формата. Если ничего другого, это довольно избыточно.

Я подозреваю, что у вас есть проблема, когда у вас нет вкладок, которые, как вы думали, были у вас. Текстовые редакторы программистов часто настроены на замену вкладок пробелами; это может быть то, что здесь происходит. Например, то, что вы вставили в вопрос, не включает вкладки.

Я бы посоветовал вам попытаться исправить проблемы ввода и использовать что-то более похожее на исходный ответ. Это обходной путь для некоторых странных данных, которые, скорее всего, являются артефактом вашего процесса разработки / отображения, а не чем-то фундаментальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...