vsy*_*ync 8 html javascript json
我浪费了太多时间在这上面......递归部分非常虚幻.
对于给定的HTML结构,深度未知,我需要转换为JSON.
(我使用的是我正在构建的一些YAML i18n翻译系统)
我的一般想法是深入到它找到INPUT,然后创建一个具有键/值的span.innerHTML/input.value对象,并返回该对象,因此它将是最后<span class="title">到达的KEY的VALUE .
(是的,它有点复杂,但开发非常有趣)
JSBIN游乐场 - 实时代码示例
我不能让我的递归函数正常工作,输出我想要的JSON ...
<ul>
<li>
<span class="title">footer</span>
<ul>
<li>
<span>statement</span>
<input type="text" value="xxx">
</li>
</ul>
</li>
<li>
<span class="title">landing</span>
<ul>
<li>
<span>page_title</span>
<input type="text" value="yyy">
</li>
<li>
<span>page_sub_title</span>
<input type="text" value="xxx">
</li>
<li>
<span class="title">pricing</span>
<ul class="level11">
<li>
<span>title</span>
<input type="text" value="aaa">
</li>
<li>
<span>cost</span>
<input type="text" value="xxx">
</li>
</ul>
</li>
</ul>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
{
footer : {
statement : 'xxx'
},
landing : {
page_title : 'yyy',
page_sub_title : 'xxx',
pricing : {
title : 'aaa',
cost : 'xxx'
}
}
}
Run Code Online (Sandbox Code Playgroud)
我是新来的,我找不到如何发表评论.我想问你这是否总是结构,无论是否是部门.如果答案是否定的,那么请不要阅读我的答案:).
所以首先我添加了一个函数getPrevious,因为直接尝试获取前一个兄弟会返回一个文本节点.接下来我稍微改变了递归,因为它不是简单的递归,json格式(父子关系)与html格式不同.我试了两个级别,没关系.如果不是,我希望它有用而且很抱歉.
function getPrevious(element)
{
var prev_el = element.previousSibling;
while (prev_el.nodeType == 3)
{
prev_el = prev_el.previousSibling;
}
return prev_el;
}
function recursive(element){
//var classname = element.className.split(' ');
// element.nodeName == 'UL'
var Result = {"title": '', "json": {}};
var json = {};
var cur_json_key = '';
if( element.nodeType == 3 )
return;
else{
//console.log( element.nodeType, element );
var nodeName = element.nodeName.toLowerCase();
var nodeClass = element.className.toLowerCase();
// if this is the SPAN with class 'TITLE', then create an object with the innerHTML as KEY
// and later the value should be another object, returned from the recursion...
if( nodeName == 'span' && nodeClass == 'title' ){
json[element.innerHTML] = {};
Result.title = element.innerHTML;
Result.json = json;
}
else
if( nodeName == 'input' ){
// if this is an INPUT field, then the SPAN sibling before it is the KEY.
var key = getPrevious(element).innerHTML;
var val = element.value;
Result.json[key] = val;
}
else
{
var is_title_found = 0;
var title_found = '';
var res = {}
// go deeper
for( var child=0; child < element.childNodes.length; child++ ){
//json = $.extend( {}, recursive( element.childNodes[child] ));
res = recursive( element.childNodes[child]);
if (res)
{
if (res.title != '')
{
is_title_found = 1;
title_found = res.title;
}
else
{
$.extend(true, json, res.json);
}
console.log(JSON.stringify(json));
}
}
if (title_found)
{
Result.json[title_found] = json
}
else
{
Result.json = json;
}
}
return Result;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你能说服自己使用jQuery,试试这个:
function helper(root) {
var result = {};
$('> ul > li > span', root).each(function () {
result[$(this).text()] = $(this).hasClass('title') ? helper($(this).parent()) : $(this).next('input').val();
});
return result;
}
console.log(helper('body'));
Run Code Online (Sandbox Code Playgroud)