获取$('div')中的最后一项.the each()

时间:2010-10-20 12:16:43

标签: javascript jquery function each

我正在使用jquery和每个函数,但我无法找到ul列表中的最后一项。

DATA:

<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 个答案:

答案 0 :(得分:5)

您正在尝试从匹配集中选择最后一个元素(仅包含ul而不是其子元素(li个元素))。您需要在当前选择的 children 上执行此操作:

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

或(作为选择器):

$('#'+i+' > li:last')

答案 1 :(得分:1)

2次更改

  1. 使用

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

    而不是

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

  2. 将条件更改为

  3. 如果($(本)的.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);
    

答案 2 :(得分:1)

首先,您的输出看起来像JSON代码。既然你已经在使用jQuery,那么生成JSON代码比从头构建字符串要容易得多。

其次,一个建议:如果你为<ul>标签使用了一个类名,你就不需要为那些数字ID弄乱for()循环(你真的需要数字ID吗?他们最终会咬你的! - 请记住,ID应该在页面上是唯一的。加上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()方法;我记不住了)

答案 3 :(得分:1)

重新阅读你的问题之后,你真正想要的是一种聪明的输出方式,而不是检测最后一个元素。

您应该执行以下操作:

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的建议)

答案 4 :(得分:0)

我建议你用字符串创建一个数组,然后用逗号连接它们。

这样的事情:

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

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

因此,在each循环的每次迭代中,您都会为您的数组构建一个类似"1:{1,2,3}"push的字符串。

答案 5 :(得分:0)

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/

答案 6 :(得分:0)

其中一个问题是您正在尝试在对象中使用数字作为成员名称。我将通过在基础对象中使用“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进行排序,并对每个UL的每个LI进行排序。

应输出:

{"id-1": [1,2,3], "id-2":, [1,2,3], "id-3":[1,2,3]}