2012-03-11 3 views
0

У меня есть этот уродливый список выбора с отступом ("-") для иллюстрации иерархии. Я хотел бы, используя jquery, получить данные из источника.Вырезать строки с отступом до иерархии с jquery

Источник

<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 
    } 
    } 
}; 

Обратите внимание, как значение параметра добавляются только глубинный уровень. UPDATE: обновленный результат для кода и согласованности с eacier, родителям не хватало значения, он должен быть esier для анализа этого результата.

Мои навыки jquery являются средними, но я думаю, что смогу понять это, если кто-то может предложить направление.

+0

что связь между одномерным списком опций и мульти объекта измерения ... нужно больше информации, чтобы цель здесь?. – charlietfl

+0

Обновленный вопрос с более четким акцентом на символ «-», используемый для представления иерархии. – henrijs

+0

до сих пор неясно, какая цель ..параметр вариантов объекта? если этого недостаточно, чтобы понять отношения между родителями и детьми, письменное объяснение поможет – charlietfl

ответ

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 вы для вашего ответа. Im тестирует оба предложения. Запуск кода как есть, дает ошибку в консоли firebug «parent is undefined» if (typeof parent [path [i]] === 'undefined') {"" – henrijs

+0

Можете ли вы сделать скрипку с вашим тестовым кодом? В приведенной выше скрипте такой ошибки нет, поэтому это может быть проблема с областью. – Yoshi

+0

да, на самом деле оба примера имеют одинаковую проблему, в другом примере говорится: «tempParent undefined», если (! TempParent.items) {«" Я буду играть. – henrijs

2

Я получил хорошее начало при анализе вариантов объекта. Потратил на него больше, чем я ожидал, и значения показывают на каждом уровне, когда дети - это объекты с именем «предметы» во всех случаях. С небольшим дополнительным отображением и рефакторингом вы можете получить его в нужном формате.

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