After scraping an html table I have stored my data in the variable:
var data = ["header1", "header2", "a1", "a2", "b1", "b2", "c1", "c2"];
I want to create a json file in the form:
var json = [
{
"header1":"a1",
"header2":"a2"
},
{
"header1":"b1",
"header2":"b2"
},
{
"header1":"c1",
"header2":"c2"
}
];
I know that I need
var headers={};
and load it with
headers["header1"] and headers["header2"]
I also need
var jsonObj = [];
and push the array headers inside jsonObj:
jsonObj.push(headers);
Is it possible to create it?
CodePudding user response:
I'll make some assumptions, and then attempt to answer your question.
To me, it seems your table looks something like:
header1 | header2 |
---|---|
a1 | a2 |
b1 | b2 |
c1 | c2 |
Simply starting with the array you already have, we can then just pick out two and two values at the time. See the code below
const COLUMN_COUNT = 2
const data = ["header1", "header2", "a1", "a2", "b1", "b2", "c1", "c2"]
// this removes the headers from the data-list,
// and stores them in the headers variable
const headers = data.splice(0, COLUMN_COUNT)
const output = []
while(data.length > 0) {
const row = {}
const values = data.splice(0, COLUMN_COUNT)
for(const [idx, value] of values.entries()) {
const header = headers[idx]
row[header] = value
}
output.push(row)
}
console.log(output)
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>
CodePudding user response:
There is actually no relation between header and the values, but assuming the first two elements are always header1 and header2
and the next 1 pair will be the value of header1 and header2 respectively, this might do it
const data = ["header1", "header2", "a1", "a2", "b1", "b2", "c1", "c2"];
const res = [];
const h1 = data[0];
const h2 = data[1];
data.splice(0, 2);
for (let i = 0; i < data.length; i ) {
if (i % 2 != 0) {
const payload = {};
payload[h1] = data[i - 1];
payload[h2] = data[i];
res.push(payload);
}
}
console.log(res)
<iframe name="sif2" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>