Превращение HTML <dl>во вложенный массив JavaScript с помощью jQuery - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть список определений HTML, и я хочу использовать jQuery, чтобы превратить его во вложенный массив JavaScript. Какой самый простой способ сделать это? Спасибо за вашу помощь.

Мой вклад выглядит так:

<dl>
  <dt>A</dt>
   <dd>A1</dd>
  <dt>B</dt>
   <dd>B1</dd>
   <dd>B2</dd>
</dl>

Я хочу, чтобы мой вывод выглядел так:

[['A', 'A1'], ['B', 'B1', 'B2']]

Ответы [ 5 ]

4 голосов
/ 18 ноября 2011
var final_array = []; 

$('dl dt').each(function(){
   var dt_dds = [];   /* array to hold the dt_dds */ 
   dt_dds.push( $(this).text() );  /* push the dt */ 
   dds = $(this).nextUntil('dt'); /* get all dd's until the next dt */ 
   dds.each(function(){  dt_dds.push( $(this).text() )}); /** push all dd's into the array*/ 
   final_array.push( dt_dds ); 
})

console.log( final_array ); 

Вот скрипка .

1 голос
/ 18 ноября 2011

nextUntil (...) сделает все возможное, чтобы получить dd

var result = [];

$("dt").each(function() {
    var el = $(this),
        tmp = [el.text()];

    el.nextUntil("dt").each(function() {
        tmp.push($(this).text());
    });

    result.push(tmp);
});

console.log(result);

скрипку

1 голос
/ 18 ноября 2011

Вы можете использовать .map(), чтобы сделать это:

var array = $('dl dt').map(function() {
  // Get the ['A1'] and ['B1', 'B2']
   var items = $(this).nextUntil('dt', 'dd').map(function() {
    return $(this).text();
  }).get();

  // Prepend the dt's value
  items.unshift($(this).text());

  // Needs to be wrapped in a second array so that .map() doesn't flatten.
  return [ items ];
}).get();

Демо: http://jsfiddle.net/LjZDt/1/

Больше информации об этой технике здесь: http://encosia.com/use-jquery-to-extract-data-from-html-lists-and-tables/

1 голос
/ 18 ноября 2011

Это не очень элегантно, но вы можете перебирать дочерние элементы тега <dl>, создавать массив для каждого набора тегов <dt> / <dd> и .push этого массива в выходной массив:

//setup two arrays, one as a final output and one that will hold each sub-array
var output = [],
    temp   = [];

//iterate through each child element of the `<dl>` element
$('dl').children().each(function () {

    //if this element is a `<dt>` tag
    if (this.tagName == 'DT') {

        //if the `temp` array is not empty
        if (0 in temp) {

            //`.push` the `temp` array onto the `output` array
            output.push(temp);
        }

        //add the text of this `<dt>` tag to the `temp` array as the first key (erasing any data that was inside the `temp` array)
        temp = [$(this).text()];
    } else {

        //if the tag found was anything other than a `<dt>` tag (I'm assuming it's a `<dd>` tag) then `.push` its text into the `temp` array
        temp.push($(this).text());
    }
});

//make sure to add the last iteration of the `temp` array to the `output` array
output.push(temp);

//for the structure supplied in the question, the output looks like this: [["A", "A1"], ["B", "B1", "B2"]]

Демонстрацию этого кода можно найти по адресу: http://jsfiddle.net/qkjKp/

1 голос
/ 18 ноября 2011

Вы можете попробовать что-то вроде этого:

var a = [];
var b = [];

var dlc = $("dl").children();

dlc.each(function (i) {
    if (this.nodeName == "DT") {
       if (b.length) a.push(b);
       b = [$(this).html()]; 
    } else {
       b.push($(this).html());   
    }
    if (i == (dlc.length-1)) {
        a.push(b);
        console.log(a);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...