我正在使用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}}
答案 0 :(得分:5)
您正在尝试从匹配集中选择最后一个元素(仅包含ul
而不是其子元素(li
个元素))。您需要在当前选择的 children 上执行此操作:
$('#'+i).children('li').last()
或(作为选择器):
$('#'+i+' > li:last')
答案 1 :(得分:1)
2次更改
使用
test + = $(this).text();
而不是
test + = $(this).attr('id');
将条件更改为
如果($(本)的.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]}