Javascript 如何在jQuery中使用偏移量进行迭代?
给定HTMLJavascript 如何在jQuery中使用偏移量进行迭代?,javascript,jquery,iteration,each,Javascript,Jquery,Iteration,Each,给定HTML <ol> <li>The seventh</li> <li>8th</li> <li>(10-1)</li> <li>One</li> <li>2</li> <li>Trois</li> </ol> <ol> <li>Fourth<
<ol>
<li>The seventh</li>
<li>8th</li>
<li>(10-1)</li>
<li>One</li>
<li>2</li>
<li>Trois</li>
</ol>
<ol>
<li>Fourth</li>
<li>5</li>
<li>Number six</li>
</ol>
如何调整迭代顺序,使其从元素一开始,到元素(10-1) 结束
.也许没有什么比这更适合你的情况了:
$.each(["one", "two", "three", "four", "five", ...], function(i, v) {
var $this = $("li." + v);
// ...
});
演示:您不能合理地期望JavaScript在不做大量额外工作的情况下,以数字顺序智能地对英语数字进行排序。最好添加一个带有数字顺序的data-
属性,然后使用简单的for
循环提取这些属性
HTML:
四个
五个
一个
两个
三个
JS:
var max=$('li')。长度;
对于(var i=1;i
添加一个排序器
数组,并调用.sort()
:
实例:不要使用诸如“一”、“二”和“三”之类的类将自己描绘成一个角落。而是自动生成一个可排序的属性值,如数据顺序
,它将以数字作为值:
<li data-order=7>Seven</li>
<li data-order=8>Eight</li>
<li data-order=1>One</li>
演示:
只需使用普通JavaScript循环即可:
var $query = $("li");
var count = $query.length;
var offset = 2;
for(var i=0; i<count; i++) {
var domEl = $query.get((i + offset)%count);
//alert(domEl.getAttribute("class"));
alert($(domEl).attr("class"));
}
var$query=$(“li”);
var count=$query.length;
var偏移=2;
对于(var i=0;i给你:
var $list = $("li");
for (var i=2, l = $list.length, len = l + 2; i < len; i++) {
alert($list.eq(i % l).attr('class'));
}
var$list=$(“li”);
对于(变量i=2,l=$list.length,len=l+2;i
在jQuery中重新排序集合并不是一个好方法,但您可以使用集合长度和偏移量来生成任意循环。我将把它作为一个练习留给读者,让读者动态地计算出起始索引,我认为您需要这样做。您可以创建自己的方法,下面是我的做法(我花了很长时间才弄明白)
它的工作原理与jQuery的each()
方法完全相同,只是添加了offset参数
$("li").offsetEach(integer_offset, function(index, element) {
// iterates through all elements, but starts with an offset index
});
偏移量是从零开始的,因此对于您的示例,您可以这样做,从One
$("li").offsetEach(3, function() {
alert( $(this).text() );
});
“六”、“七”、“八”…你的解决方案太具体了,无法扩展到更大的数字。哦,突然,几秒钟后又被打败了。+1 I s'pose!@Jamiec这有点老套,但在这种情况下没有其他防弹逻辑。+1很难理解问题的背景和本质。jQuery提供了每个作为一种方便,但编写了一个loop通常很容易,除非你的具体情况有什么棘手的地方。另外,对拼写出来的数字进行排序是你问题的一个重要部分吗?我们根本不排序!我在寻找一个偏移量。你一直使用这个词。我想你希望它任意地从nli
开始,然后循环到顶部?@Blazemonger这就是我的阅读方式。当你获取jQuery集合时,它会以DOM顺序返回。他希望迭代集合,从任意索引开始,但仍然覆盖整个集合。@Mathletics-是的!我宣布你是我的新最好的朋友。你是对的-它不会对英文数字排序,但你可以教它这样做;)对已知的、数量有限的单词这样做是微不足道的。但是运算是否会在8点停止,或者可能会上升到22点?将英语数字解析为整数是一个复杂而独特的问题。最好的解决方案是绕过它。pfft,它可能会上升到100万,同样的解决方案仍然有效,你只要ave构造数组。@Jamiec这只是一个最字面意义上的解决方案。我们不能鼓励这种疯狂行为。提供一个表示字符串排序顺序的数组有什么疯狂之处?它们可以是英语数字,也可以是动物物种,或者任何你想确定排序顺序的基于语言的字符串。I我已经无数次地使用过这种技术,但我看不出它有什么疯狂之处评论有点陈腐,但在我看来这个概念是合理的。实际上我更喜欢这个解决方案;我随意选择类名是为了可读性,而没有意识到它们会提供一个新的解决方案!@RichardJPLeGuen-重要的不是你想用什么来排列你的元素,重要的是你有一些可以用来de>indexOf
到一个用于定义排序器的数组中。您的演示似乎没有做您想做的事情。@Blazemonger事实上,它做了……它为您做了什么?@Blazemonger是的,集合在JavaScript中是以零为基础的,因此第7项在索引6,eigth在索引7,第一项在索引0。这就是为什么['foo'][0]
返回'foo'
,而['foo'][1]
不返回。这是我的答案的更好版本。@Mathletics-我有点希望你没有删除答案;现在我必须记住在两天后回到这个问题来接受我的答案。取消删除,尽管我保留你的答案更好。
<li data-order=7>Seven</li>
<li data-order=8>Eight</li>
<li data-order=1>One</li>
$('li[data-order]').sort(sortByData).text(changeText);
function sortByData (one, two) {
return $(one).data("order") - $(two).data("order");
}
function changeText (index, value) {
return index + " " + value;
}
var $query = $("li");
var count = $query.length;
var offset = 2;
for(var i=0; i<count; i++) {
var domEl = $query.get((i + offset)%count);
//alert(domEl.getAttribute("class"));
alert($(domEl).attr("class"));
}
var $list = $("li");
for (var i=2, l = $list.length, len = l + 2; i < len; i++) {
alert($list.eq(i % l).attr('class'));
}
$.fn.offsetEach = function(offset, cb) {
$(this.get().splice(offset).concat(this.get().splice(0,offset))).each(cb);
}
$("li").offsetEach(integer_offset, function(index, element) {
// iterates through all elements, but starts with an offset index
});
$("li").offsetEach(3, function() {
alert( $(this).text() );
});