Получение последнего элемента в $ ('div'). Each () - PullRequest
2 голосов
/ 20 октября 2010

Я использую jquery и каждую функцию, но у меня возникают проблемы с поиском последнего элемента в списке ul.

ДАННЫЕ:

<ul id="1">
     <li>1</li>
     <li>2</li>
     <li>3</li>
</ul>
<ul id="2">
     <li>1</li>
     <li>2</li>
     <li>3</li>
</ul>
<ul id="3">
     <li>1</li>
     <li>2</li>
     <li>3</li>
</ul>

Я пробовал несколько вещей, но ничто не делает то, что я хочу. Вот я попробовал.

var test = '{';
for (i = 1; i <= 3; i++) {
     test += i+':{';
     $('#'+i+' li').each(function(index,e){
          test += $(this).attr('id');

          // THIS IS THE PROBLEM AREA START
          if(index != $('#'+i).last()){
               test += ',';
          }
          // PROBLEM AREA END

     });
     test += '}';
     if(i != 3){
          test += ',';
     }
}
test += '}';
alert(test);

Я также пытался использовать "$ ('#' + i + ': last')", но это не сработало.

Вывод, который я пытаюсь получить:

{1:{1,2,3},2:{1,2,3},3:{1,2,3}}

Ответы [ 7 ]

5 голосов
/ 20 октября 2010

Вы пытаетесь выбрать последний элемент из соответствующего набора (который состоит только из вашего ul, а не его дочерних элементов (которые являются li элементами)).Это необходимо сделать для потомков текущего выбора:

$('#'+i).children('li').last()

или (в качестве селектора):

$('#'+i+' > li:last')
1 голос
/ 20 октября 2010

Перечитав ваш вопрос, вы действительно захотите сделать вывод, не определяя, какой элемент последний.

Вы должны сделать что-то вроде:

var rootArr = new Array();

for (i = 1; i <= 3; i++) {  
   var liArr = new Array();
   $("#" + i + " li").each(function() {
      // add code to 
      liArr.push($(this).text());
   }
   rootArr.push(i + ":{" + liArr.join(",")  + "}");
}

var result = "{" + rootArr.join(",") + "}";

(по совету SkillDrick)

1 голос
/ 20 октября 2010

Во-первых, ваш вывод выглядит как код JSON. Поскольку вы уже используете jQuery, существует гораздо более простой способ генерации кода JSON, чем создание строки с нуля.

Во-вторых, предложение: если вы используете имя класса для своих тегов <ul>, вам не нужно возиться с циклом for() для этих числовых идентификаторов (вам действительно нужны числовые идентификаторы? Они будут кусаться Вы в конечном итоге! - Имейте в виду, что идентификаторы должны быть уникальными по всей странице. Кроме того, JSON ожидает, что массивы с числовыми индексами будут обозначаться в квадратных скобках, а не в фигурных скобках, которые вы используете).

<ul class='mylist'>
    <li>1</li>
    ...

Тогда вы можете написать такой код:

myarray=[];
$('.mylist').each(function(ulindex) {
  myarray[ulindex]=[];
  $(this).children().each(function(liindex) {
    myarray[ulindex][liindex]=$(this).text();
  })
});
$output=$.toJSON(myarray);

Код выше не проверен, но должен быть достаточно близко, чтобы дать вам представление. (примечание: вам может понадобиться плагин jquery, чтобы получить метод toJSON(); я не могу вспомнить)

1 голос
/ 20 октября 2010

2 изменения

  1. Использование

    test + = $ (this) .text ();

    вместо

    test + = $ (this) .attr ('id');

  2. Изменить, если условие на

если ($ (это) .next (). Длина) {

Модифицированный код

var test = '{';
for (i = 1; i <= 3; i++) {
     test += i+':{';
     $('#'+i+' li').each(function(index,e){
          // Change #1
          test += $(this).text();

          // Change #2
          if($(this).next().length){
               test += ',';
          }
     });
     test += '}';
     if(i != 3){
          test += ',';
     }
}
test += '}';
alert(test);
0 голосов
/ 20 октября 2010

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

    var out = {};    
    $("ul").each(function() {
        var ul = [];
        $(this).find("li").each(function() {
            ul.push($(this).text()); // maybe .html() ?
        });
        out."id-" + $(this).attr("id") = ul;
    });
    console.log(JSON.parse(out));

Я не проверял это, но вы поняли идею. Сортировка по каждому UL и сортировка по каждому LI каждого UL.

Должен вывести:

{"id-1": [1,2,3], "id-2":, [1,2,3], "id-3":[1,2,3]}
0 голосов
/ 20 октября 2010

jQuery фактически использует свойство .length (http://api.jquery.com/length/) каждого объекта. Поэтому, когда вы используете селектор и у вас есть список совпадающих элементов, .length - 1 будет индексом последнего элемента.:

var test = '{';
for (i = 1; i <= 3; i++) {
     test += i+':{';
     $('#'+i+' li').each(function(index,e){
          test += $(this).attr('id'); //This is erroneous; this (ie e)'s
                                      //id is nonexistent. Do you mean .html()?

          // THIS IS THE PROBLEM AREA START
          if(index != $('#'+i+' li').length - 1){
               test += ',';
          }
          // PROBLEM AREA END

     });
     test += '}';
     if(i != 3){
          test += ',';
     }
}
test += '}';
alert(test);

Хотя здесь есть более чем несколько проблем.Если вы добавили class='include' к каждому <ul> ...

var str;
$('.include').each(function (index, e) {
    str += e.attr('id') + ": {";
    e.children().each(function (cIndex, child) {
        str += child.html() + ( cIndex != e.children().length - 1 ) ? ', ' : '';
    });
    str += '}' + ( index != e.parent().children().length - 1);
});

Может дать некоторые полезные советы.По сути, вы пытаетесь написать сериализатор JSON. Возможно, вы захотите проверить http://flexjson.sourceforge.net/

0 голосов
/ 20 октября 2010

Я бы порекомендовал вам создать массив с вашими строками, а затем соединить их запятой.

Так что-то вроде этого:

var arr = ["1:{1,2,3}", "2:{1,2,3}", "3:{1,2,3}"];

var str = "{" + myArray.join(",") + "}";

Таким образом, в каждой итерации цикла each вы должны создать строку типа "1:{1,2,3}" и push в массиве.

...