JQuery .each () para trás

Estou usando o JQuery para selecionar alguns elementos em uma página e movê-los no DOM. O problema que estou tendo é que eu preciso selecionar todos os elementos na ordem inversa que a JQuery naturalmente deseja selecioná-los. Por exemplo:

  • Item 1
  • Item 2
  • Item 3
  • Item 4
  • Item 5

Eu quero selecionar todos os itens li e usar o comando .each (), mas eu quero começar com o Item 5, o Item 4, etc. Isso é possível?

 $($("li").get().reverse()).each(function() { /* ... */ }); 

Eu apresento a você o caminho mais limpo de todos os tempos, na forma do menor plugin de jQuery do mundo:

 jQuery.fn.reverse = [].reverse; 

Uso:

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

-Todos os créditos para Michael Geary em seu post aqui: http://www.mail-archive.com/discuss@jquery.com/msg04261.html

Você pode fazer

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

Seguido por

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

Aqui estão as diferentes opções para isso:

Primeiro : sem 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; }); 

Demo aqui

… e com jQuery:

Você pode usar isto:

 $($("ul > li").get().reverse()).each(function (i) { $(this).text( 'Item ' + (++i)); }); 

Demo aqui

Outra maneira, usando também jQuery com reverso é:

 $.fn.reverse = [].reverse; $("ul > li").reverse().each(function (i) { $(this).text( 'Item ' + (++i)); }); 

Esta demonstração aqui .

Outra alternativa é usar o length (contagem de elementos correspondentes a esse seletor) e descer a partir daí usando o index de cada iteração. Então você pode usar isto:

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

Esta demo aqui

Mais um tipo de relacionado com o acima:

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

Demo aqui

Eu prefiro criar um plug-in reverso, por exemplo

 jQuery.fn.reverse = function(fn) { var i = this.length; while(i--) { fn.call(this[i], i, this[i]) } }; 

Uso por exemplo:

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

Se você não quiser salvar o método em jQuery.fn você pode usar

 [].reverse.call($('li')); 

Necessário para fazer um reverso em $. Cada, então eu usei a idéia de Vinay:

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

funcionou bem, obrigado

Você não pode iterar para trás com a function jQuery each, mas ainda pode aproveitar a syntax do jQuery.

Tente o seguinte:

 //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 } 

Eu encontrei Array.prototype.reverse sem sucesso com objects, então eu fiz uma nova function jQuery para usar como uma alternativa: jQuery.eachBack() . Ele percorre o jQuery.each() normal e armazena cada chave em uma matriz. Em seguida, ele inverte essa matriz e executa o retorno de chamada na matriz / object original na ordem das chaves invertidas.

 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); } 

Eu reconheço que o jQuery suporta e encoraja plugins. Dito isso, você pode achar este artigo relevante: não modifique objects que você não possui . Nesse caso, pelo menos, optei por não estender o jQuery na chance de que outro plugin defina o contrário de maneira diferente.

Aqui está uma solução simples que não estende o object jQuery.

 function jqueryReverse( set ) { return [].reverse.call( set ); } console.log( jqueryReverse( $( 'li' ) ) ); 

Eu acho que vc precisa

 .parentsUntill() 

Você também pode tentar

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