Разобрать отступ строки в иерархии с помощью jquery - PullRequest
0 голосов
/ 12 марта 2012

У меня есть этот уродливый список выбора с отступами ("-") для иллюстрации иерархии. Я хотел бы, используя 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
    }
  }
};

Обратите внимание, как значение параметра добавляется только к самому глубокому уровню. ОБНОВЛЕНИЕ: обновлен результат для более быстрого кода и согласованности, у родителей отсутствует значение, поэтому анализ должен быть более сложным.

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

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

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

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

1 голос
/ 12 марта 2012
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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...