Estou usando a biblioteca JS Underscore e, em particular, usando as chamadas de biblioteca _.each
e _.sortby
. Estou me perguntando se há alguma maneira possível de obter o índice do valor dentro do representante do iterador
_.sortBy([1, 4, 2, 66, 444, 9], function(num){
/*It'd be great to have access to the index in here */
return Math.sin(num);
});
javascript
underscore.js
contactmatt
fonte
fonte
sortBy
partir da versão 4.17.4, o que provavelmente é mais útil saber neste cenário.Você pode obter o índice da iteração atual adicionando outro parâmetro ao seu iterador
function
, por exemplofonte
Se você preferir transformar sua matriz, o
iterator
parâmetro damap
função de sublinhado também é passado para o índice como um segundo argumento. Assim:... retorna:
fonte
O iterador de
_.each
é chamado com 3 parâmetros(element, index, list)
. Então sim, para_.each
você pode obter o índice.Você pode fazer o mesmo em sortBy
fonte
Acho que vale a pena mencionar como o _.each () do Underscore funciona internamente. O _.each (list, iteratee) verifica se a lista passada é um objeto de matriz ou um objeto.
No caso de a lista ser uma matriz, os argumentos do iteratário serão um elemento da lista e um índice como no exemplo a seguir:
Por outro lado, se o argumento de lista for um objeto, o iteratário pegará um elemento de lista e uma chave:
Para referência, este é o código _.each () de Underscore.js 1.8.3
fonte
De maneira mais geral, na maioria das circunstâncias, as funções de sublinhado que recebem uma lista e um argumento como os dois primeiros argumentos fornecem acesso ao índice da lista como o penúltimo argumento do iterador. Esta é uma distinção importante quando se trata de duas funções de sublinhado, _.reduce e _.reduceRight, que usam 'memo' como seu terceiro argumento - no caso desses dois, o índice não será o segundo argumento, mas o terceiro:
Então, se você queria você poderia obter o índice usando sublinhado si:
_.last(_.initial(arguments))
. Uma possível exceção (eu não tentei) é _.map, pois ele pode pegar um objeto em vez de uma lista: "Se lista for um objeto JavaScript, os argumentos do iterador serão (valor, chave, lista)." - consulte: http://underscorejs.org/#mapfonte
Quando disponível, acredito que a maioria das funções do array lodash mostrará a iteração. Mas a classificação não é realmente uma iteração da mesma maneira: quando você está no número 66, não está processando o quarto item no array até que ele esteja concluído. Uma função de classificação personalizada fará um loop em uma matriz várias vezes, empurrando os números adjacentes para frente ou para trás, até que tudo esteja em seu devido lugar.
fonte