Javascript JQuery.each()向后

Javascript JQuery.each()向后,javascript,jquery,arrays,reverse,Javascript,Jquery,Arrays,Reverse,我使用JQuery在页面上选择一些元素,然后在DOM中移动它们。我遇到的问题是,我需要按照JQuery自然希望选择的相反顺序选择所有元素。例如: <ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> <li>Item 4</li> <li>Item 5</li> </ul>

我使用JQuery在页面上选择一些元素,然后在DOM中移动它们。我遇到的问题是,我需要按照JQuery自然希望选择的相反顺序选择所有元素。例如:

<ul>
   <li>Item 1</li>
   <li>Item 2</li>
   <li>Item 3</li>
   <li>Item 4</li>
   <li>Item 5</li>
</ul>
  • 项目1
  • 项目2
  • 项目3
  • 项目4
  • 项目5

我想选择所有li项并对它们使用.each()命令,但我想从第5项开始,然后是第4项等等。这可能吗?

您不能使用jQuery-each函数反向迭代,但仍然可以利用jQuery语法

请尝试以下操作:

//get an array of the matching DOM elements   
var liItems = $("ul#myUL li").get();

//iterate through this array in reverse order    
for(var i = liItems.length - 1; i >= 0; --i)
{
  //do Something
}
你能行

jQuery.fn.reverse = function() {
    return this.pushStack(this.get().reverse(), arguments);
}; 

$(selector).reverse().each(...) 

需要对$进行反向操作。因此我使用了Vinay的想法:

//jQuery.each(collection, callback) =>
$.each($(collection).get().reverse(), callback func() {});

工作很好,谢谢我更喜欢创建一个反向插件

jQuery.fn.reverse = function(fn) {       
   var i = this.length;

   while(i--) {
       fn.call(this[i], i, this[i])
   }
};
用法例如:

$('#product-panel > div').reverse(function(i, e) {
    alert(i);
    alert(e);
});

我以世界上最小的jquery插件的形式向您展示了有史以来最干净的方式:

jQuery.fn.reverse = [].reverse;
用法:

$('jquery-selectors-go-here').reverse().each(function () {
    //business as usual goes here
});

-Michael Geary在其帖子中的所有功劳如下:

这里有不同的选择:

首先:没有jQuery:

var lis = document.querySelectorAll('ul > li');
var contents = [].map.call(lis, function (li) {
    return li.innerHTML;
}).reverse().forEach(function (content, i) {
    lis[i].innerHTML = content;
});
演示 。。。对于jQuery:

您可以使用以下选项:

$($("ul > li").get().reverse()).each(function (i) {
    $(this).text( 'Item ' + (++i));
});
var $li = $("ul > li");
$li.each(function (i) {
    $(this).text( 'Item ' + ($li.length - i));
});
演示

另一种方法,也可将jQuery与is一起使用:

这个演示

另一个替代方法是使用
长度(匹配该选择器的元素计数),然后使用每次迭代的
索引
。然后你可以使用这个:

$($("ul > li").get().reverse()).each(function (i) {
    $(this).text( 'Item ' + (++i));
});
var $li = $("ul > li");
$li.each(function (i) {
    $(this).text( 'Item ' + ($li.length - i));
});
这个演示

还有一个,与上面的一个相关:

var $li = $("ul > li");
$li.text(function (i) {
    return 'Item ' + ($li.length - i);
});
演示

我想你需要

.parentsUntill()

我发现
Array.prototype.reverse
对对象不成功,所以我创建了一个新的jQuery函数作为替代:
jQuery.eachBack()
。它像普通的
jQuery.each()
一样迭代,并将每个键存储到一个数组中。然后,它反转该数组,并按照反转键的顺序对原始数组/对象执行回调

jQuery.eachBack=function (obj, callback) {
    var revKeys=[]; $.each(obj,function(rind,rval){revKeys.push(rind);}); 
    revKeys.reverse();
    $.each(revKeys,function (kind,i){
        if(callback.call(obj[i], i, obj[i]) === false) {    return false;}
    });
    return obj;
}   
jQuery.fn.eachBack=function (callback,args) {
    return jQuery.eachBack(this, callback, args);
}

如果不想将方法保存到jQuery.fn中,可以使用

[].reverse.call($('li'));
你也可以试试

var arr = [].reverse.call($('li'))
arr.each(function(){ ... })

这种方法最初是由johnresig(jquerydeveloper)在上提出的;这应该是
$。each(collection.reverse(),…)
@Ben Alpert-您的评论有缺陷,因为collection不是真正的arrayOk,我同意这很酷,但它为什么有效?您正在将Array.prototype.reverse复制到jQuery.prototype.reverse,当调用它时,
对象具有数字属性和长度属性,因此javascript可以对其进行索引,并可以将数组函数应用到jQuery实例?请务必注意,索引没有反转,因此,如果您只想做最后三项,例如,您不能期望
  • 第5项的索引为0。@Matthew-是的,您理解正确。该代码确实将对
    Array.prototype.reverse
    的引用复制到了
    jQuery.prototype.reverse
    。许多JavaScript数组方法在任何看起来足够像数组的对象上都能很好地工作——如果对象具有
    .length
    和数字索引属性<代码>反向
  • 不依赖于数组的某些内部表示;它使用普通的
    .length
    [0]
    [1]
    等访问数组。就像您自己编写的数组代码一样。实例化一个新数组只是为了得到它的
    reverse
    方法不是很浪费吗?复制对函数
    Array.prototype.reverse
    的引用不是更快吗,例如
    jQuery.fn.reverse=Array.prototype.reverse?不是那么短和“聪明”,而是更高效?诚然,在今天闪电般的浏览器中,这一点可能不会被注意到,但仍然…@Zachellath是的,我再也不能在结果之间进行任何分离了。看起来20%只是侥幸。请记住,您只设置了一次函数,因此实例化只发生一次,从那里设置函数。应该注意的是,索引不会反转,因此,如果您只想执行最后三个,例如,您不能期望第5项的索引为0。致David Andres:您可能忘记在li之前添加额外的$()。我犯了这个错误,收到了“undefined func”。@DavidAndres:You错过了
    .get()
    ,它将jQuery包装的数组变成了一个普通的JS数组。JS数组具有
    .reverse()
    。注意:
    array.reverse()
    这两种方法都会在适当的位置修改数组并返回反向数组。因此,这个解决方案实际上依赖于$().get()返回一个新数组,而不是对某个内部jQuery或DOM数组的引用。在本例的范围内,这可能是一个安全的赌注。警告编码器。我也喜欢这个想法/代码,但它不会像投票率较高的答案那样返回一个可链接的对象(这是反向的):)不过,对于它的设置方式来说,这绝对是一个不错的方法。你是对的。不可链接,因此不是有效的插件。不过,我们稍微改进了代码,将减量器移到了这种状态。你为什么这么认为?你会怎么用?这就是我要找的。