2012-03-11 62 views
0

我有这个丑陋的选择列表与缩进(“ - ”)来说明层次结构。我想用jquery从源代码获取数据。解析缩进字符串与jquery hierrarhy

<option value="12">Subcontractor</option> 
<option value="108">-Surveyor</option> 
<option value="62">--Excavation works</option> 
<option value="554">--Concrete works</option> 
<option value="44">-Demolition works</option> 
<option value="103">--Site preparation works</option> 
<option value="67">--Excavation works</option> 
<option value="40">--Contamination works</option> 

实施例示出了4个级别,但水平计数是未知的。

结果

var result = { 
    "Subcontractor":12 { 
    "Surveyor":108 { 
     "Excavation works":62, 
     "Concrete works":554 
    }, 
    "Demolition works":44 { 
     "Site preparation works":103, 
     "Excavation works":67, 
     "Contamination works":40 
    } 
    } 
}; 

通知选项值是如何加入到只有最深层次。更新:eacier代码和一致性的更新结果,父母缺少值,应该更好地解析这个结果。

我的jquery技能一般,但我想我可以弄清楚如果有人可以提出方向。

+0

什么是选项之一维列表和多维度对象之间的连接...需要更多的细节,在这里的目标? – charlietfl 2012-03-11 20:31:46

+0

更新的问题更加明确地强调了用于表示层次结构的“ - ”字符。 – henrijs 2012-03-11 20:56:43

+0

仍然不清楚什么客观是..parse选项来反对?如果没有足够的数字来表达亲子关系,书面的解释会有所帮助 – charlietfl 2012-03-11 20:59:45

回答

1
var struct = {}, path = [], indentation = '-'; 

$('option').each(function (i, el) { 
    var 
    $el = $(el), 
    val = $el.val(), 
    label = $el.text(), 
    depth = 0, 
    parent = struct, 
    i; 

    while (label.substr(0, indentation.length) === indentation) { 
    depth += 1; 
    label = label.substr(indentation.length); 
    } 

    path = path.slice(0, depth); 
    path[depth] = label; 

    for (i = 0; i < path.length; i += 1) { 
    if (typeof parent[path[i]] !== 'object') { 
     parent[path[i]] = {}; 
    } 

    if (i < path.length - 1) { 
     parent = parent[path[i]]; 
    } 
    else { 
     parent[path[i]] = val; 
    } 
    } 
}); 

console.log(struct);​ 

http://jsfiddle.net/5zqZQ/4/

以前的版本:http://jsfiddle.net/5zqZQ/3/

+0

Thanak你的答复。我正在测试两个建议。按照原样运行代码给出了萤火虫控制台中的错误“parent is undefined”if(typeof parent [path [i]] ==='undefined'){“” – henrijs 2012-03-12 11:38:35

+0

你可以用你的测试代码做一个小提琴吗?在上面的提琴没有这样的错误,所以这可能是范围问题。 – Yoshi 2012-03-12 11:50:48

+0

是的,实际上两个例子都有同样的问题,其他例子说“tempParent是未定义的”,如果(!tempParent.items){“”我会拨弄。 – henrijs 2012-03-12 12:00:18

2

我给你一个很好的开始解析对象的选项。花费的时间比我预想的还要长,每个级别上的值都显示为儿童是所有情况下名为“项目”的对象。通过一些额外的映射和重构,你可以以你想要的格式获得它。

http://jsfiddle.net/charlietfl/Z6pzv/