Как убрать лишние скобки {} и id перечисления объектов в массивах?
Недавно спрашивал по ссылке о генерации JSON из HTML.
Мне дали такой код:
const domElement = document.querySelector('.first > .second > .child').children;
let array = extractJson(domElement);
let json = JSON.stringify(array);
console.log(json);
function extractJson(dom) {
let json = {};
for (let element of dom) {
let key = element.querySelector('.name').textContent.replace(/\s\s+/g, ' ');
let val = element.querySelector('.value').textContent.replace(/\s\s+/g, ' ');
let classList = element.classList;
if (classList.contains('strg')) {
json[key] = val;
} else if (classList.contains('nmbr')) {
json[key] = parseInt(val);
} else if (classList.contains('bool')) {
let check = element.querySelector('.check');
json[key] = check.checked;
} else if (classList.contains('array')) {
let array = element.querySelector('.child').children;
json[key] = [extractJson(array)];
} else if (classList.contains('obj')) {
let array = element.querySelector('.child').children;
json[key] = extractJson(array);
}
}
return json;
}
Результат выполнения кода выходит такой:
{
"squadName": "Super hero squad",
"homeTown": "Metro City",
"formed": 2016,
"secretBase": "Super tower",
"active": false,
"members": [
{
"0": {
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": [
{
"0": "Radiation resistance",
"1": "Turning tiny",
"2": "Radiation blast"
}
]
},
"1": {
"name": "Madame Uppercut",
"age": 39,
"secretIdentity": "Jane Wilson",
"powers": [
{
"0": "Million tonne punch",
"1": "Damage resistance",
"2": "Superhuman reflexes"
}
]
},
"2": {
"name": "Eternal Flame",
"age": 1000000,
"secretIdentity": "Unknown",
"powers": [
{
"0": "Immortality",
"1": "Heat Immunity",
"2": "Inferno",
"3": "Teleportation",
"4": "Interdimensional travel"
}
]
}
}
]
}
Как убрать лишние фигурные скобки и id перечисления объектов или массивов при генерации, чтобы JSON был идентичен этому?
{
"squadName": "Super hero squad",
"homeTown": "Metro City",
"formed": 2016,
"secretBase": "Super tower",
"active": true,
"members": [
{
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": [
"Radiation resistance",
"Turning tiny",
"Radiation blast"
]
},
{
"name": "Madame Uppercut",
"age": 39,
"secretIdentity": "Jane Wilson",
"powers": [
"Million tonne punch",
"Damage resistance",
"Superhuman reflexes"
]
},
{
"name": "Eternal Flame",
"age": 1000000,
"secretIdentity": "Unknown",
"powers": [
"Immortality",
"Heat Immunity",
"Inferno",
"Teleportation",
"Interdimensional travel"
]
}
]
}
Ответы (1 шт):
Автор решения: benimaru
→ Ссылка
Нашел решение. Добавил следущую логику для массивов и вставил вызов функции в методе extractJson при проверке на массив json[key] = extractArray(array);(Спасибо Grundy♦):
function extractArray(dom) {
let arrr = [];
for (let element of dom) {
let key = element.querySelector('.name').textContent.replace(/\s\s+/g, ' ');
let val = element.querySelector('.value').textContent.replace(/\s\s+/g, ' ');
let classList = element.classList;
if (classList.contains('strg')) {
arrr[key] = val;
} else if (classList.contains('nmbr')) {
arrr[key] = parseInt(val);
} else if (classList.contains('bool')) {
let check = element.querySelector('.check');
arrr[key] = check.checked;
} else if (classList.contains('obj')) {
let array = element.querySelector('.child').children;
arrr[key] = extractJson(array);
}
}
return arrr;
Теперь JSON на входе идентичен JSON'у на выходе.