#html #node.js #json #express #node-modules
#HTML #node.js #json #выразить #узлы-модули
Вопрос:
Я искал это в течение последних 2 дней. Я не смог сделать это идеально.
Я предполагаю, что это принадлежит или может быть сделано некоторыми движками шаблонов, но.. Я не смог найти этот так называемый движок.
У меня есть это JSON array
, и я хотел бы проанализировать его обратно или преобразовать в обычный HTML, чтобы вывести его в браузер.
[
{
"tag": "figure",
"children": [
{
"tag": "div",
"attrs": {
"class": "fiwrapper"
},
"children": [
{
"tag": "img",
"attrs": {
"src": "/media/images/5cbd41bd7c566057f5e6a875.jpeg"
}
}
]
},
{
"tag": "figcaption",
"children": [
""
]
}
]
},
{
"tag": "p",
"children": [
{
"tag": "br"
}
]
},
{
"tag": "figure",
"children": [
{
"tag": "div",
"attrs": {
"class": "fiwrapper"
},
"children": [
{
"tag": "img",
"attrs": {
"src": "/media/images/5cbd45286c7210581c5563ba.jpeg"
}
}
]
},
{
"tag": "figcaption",
"children": [
""
]
}
]
},
{
"tag": "p",
"children": [
{
"tag": "br"
}
]
},
{
"tag": "p",
"children": [
"Cool Stuff.."
]
}
]
Помощь более чем приветствуется..
Комментарии:
1. Сначала вы хотели бы преобразовать массив в какой-то массив токенов. Затем вы можете превратить это в строку.
2. Что вы пробовали? Пожалуйста, отредактируйте свой вопрос, чтобы включить код, который вы написали до сих пор.
Ответ №1:
Все, что вам нужно для этого, — это рекурсивный анализатор, который будет анализировать json сверху вниз.
вот анализатор для этого в javascript, и та же логика может быть переведена на любой другой язык.
const getAttrMap = (attr) => attr ? Object.keys(attr).reduce((acc, curr) => `${acc} ${curr}="${attr[curr]}"`, '') : '';
function parseArr(arr) {
return arr.map(curr => parser(curr)).join('n');
}
function parser(obj) {
if (typeof obj === 'object') {
if (!obj.children) {
return `<${obj.tag} ${getAttrMap(obj.attrs)}/>`
}
return `<${obj.tag} ${getAttrMap(obj.attrs)}>${
obj.children instanceof Array ? parseArr(obj.children) : parser(obj.children)}</${obj.tag}>`;
}
if (!obj) {
return '';
}
return obj;
}
// usage
parseArr(inputJson);
Объяснение
Если мы знаем, как перевести один блок, мы можем перевести каждый блок рекурсивно. Для разбора одного блока логика проста.
<${obj.tag} ${getAttrMap(obj.attrs)}>CHILD</${obj.tag}>
Это преобразует объект в HTML-тег, но что, если дочерним элементом является сам другой тег? просто мы снова вызываем ту же функцию синтаксического анализа, однако в этом случае дочерним элементом может быть массив (несколько тегов) или один, основанный на том, что мы либо вызываем parseArr
, либо parser
. В случаях, когда дочерние элементы не предоставлены, мы просто возвращаем пустую строку.
Вывод
<figure ><div class="fiwrapper"><img src="/media/images/5cbd41bd7c566057f5e6a875.jpeg"></img></div>
<figcaption ></figcaption></figure>
<p ><br ></br></p>
<figure ><div class="fiwrapper"><img src="/media/images/5cbd45286c7210581c5563ba.jpeg"></img></div>
<figcaption ></figcaption></figure>
<p ><br ></p>
<p >Cool Stuff..</p>``
Комментарии:
1. Молодец.. Очень хорошо сделано! с немного большим улучшением.. Я получил идеальную функцию. Спасибо.