Czy możliwe jest pobranie indeksu, który sortujesz w Underscore.js?

88

Używam podkreślenia biblioteki JS, aw szczególności używam wywołań biblioteki _.eachi _.sortby. Zastanawiam się, czy istnieje jakikolwiek sposób na uzyskanie indeksu wartości w ramach delegata iteratora

_.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); 
});
contactmatt
źródło

Odpowiedzi:

163

Indeks jest faktycznie dostępny jak;

_.sortBy([1, 4, 2, 66, 444, 9], function(num, index){  });
osoner
źródło
Działa również dla mapy lodash
Csaba Toth
6
Niestety, to faktycznie nie działa w Lodash sortByod wersji 4.17.4, co prawdopodobnie jest bardziej pomocne w tym scenariuszu.
Jonathan Dumaine,
81

Możesz uzyskać indeks aktualnej iteracji, dodając kolejny parametr do swojego iteratora function, np

_.each(['foo', 'bar', 'baz'], function (val, i) {
    console.log(i + ": " + val); // 0: foo, 1: bar, 2: baz
});
jabclab
źródło
19

Jeśli wolisz przekształcić swoją tablicę, iteratorparametr funkcji podkreślenia mapjest również przekazywany do indeksu jako drugi argument. Więc:

_.map([1, 4, 2, 66, 444, 9], function(value, index){ return index + ':' + value; });

... zwroty:

["0:1", "1:4", "2:2", "3:66", "4:444", "5:9"]
Martin Dow
źródło
10

Iterator programu _.eachjest wywoływany z 3 parametrami (element, index, list). Więc tak, dla _.eachCiebie taksówka dostaniesz indeks.

Możesz zrobić to samo w sortBy

janith
źródło
6

Myślę, że warto wspomnieć, jak podkreślenie _.each () działa wewnętrznie. _.Each (list, iteratee) sprawdza, czy przekazana lista jest obiektem tablicy, czy też obiektem.

W przypadku, gdy lista jest tablicą, argumenty iteracyjne będą elementem listy i indeksem, jak w poniższym przykładzie:

var a = ['I', 'like', 'pancakes', 'a', 'lot', '.'];
_.each( a, function(v, k) { console.log( k + " " + v); });

0 I
1 like
2 pancakes
3 a
4 lot
5 .

Z drugiej strony, jeśli argument listy jest obiektem, iteracja weźmie element listy i klucz:

var o = {name: 'mike', lastname: 'doe', age: 21};
_.each( o, function(v, k) { console.log( k + " " + v); });

name mike
lastname doe
age 21

Dla porównania jest to kod _.each () z Underscore.js 1.8.3

_.each = _.forEach = function(obj, iteratee, context) {
   iteratee = optimizeCb(iteratee, context);
   var i, length;
   if (isArrayLike(obj)) {
      for (i = 0, length = obj.length; i < length; i++) {
         iteratee(obj[i], i, obj);
      }
   } else {
      var keys = _.keys(obj);
      for (i = 0, length = keys.length; i < length; i++) {
         iteratee(obj[keys[i]], keys[i], obj);
      }
   }
   return obj;
};
mszymulanski
źródło
1

Mówiąc bardziej ogólnie, w większości przypadków funkcje podkreślenia, które przyjmują listę i argument jako pierwsze dwa argumenty, zapewniają dostęp do indeksu listy jako przedostatniego argumentu iteratora. Jest to ważne rozróżnienie, jeśli chodzi o dwie funkcje podkreślające, _.reduce i _.reduceRight, które przyjmują „memo” jako trzeci argument - w przypadku tych dwóch indeks nie będzie drugim argumentem, ale trzeci:

var destination = (function() {
    var fields = ['_333st', 'offroad', 'fbi'];
    return _.reduce(waybillInfo.destination.split(','), function(destination, segment, index) {
        destination[fields[index]] = segment;
        return destination;
    }, {});
})();

console.log(destination);            
/*
_333st: "NYARFTW  TX"
fbi: "FTWUP"
offroad: "UP"

The following is better of course but not demonstrate my point:
var destination = _.object(['_333st', 'offroad', 'fbi'], waybillInfo.destination.split(','));
*/

Więc jeśli chcesz można uzyskać stosując indeks podkreślenia sobie: _.last(_.initial(arguments)). Możliwym wyjątkiem (nie próbowałem) jest _.map, ponieważ zamiast listy może przyjąć obiekt: „Jeśli lista jest obiektem JavaScript, argumentami iteratora będą (wartość, klucz, lista)”. - patrz: http://underscorejs.org/#map

Dexygen
źródło
0

Myślę, że większość funkcji tablicowych lodash, jeśli będzie dostępna, pokaże iterację. Ale sortowanie nie jest tak naprawdę iteracją w ten sam sposób: kiedy jesteś na liczbie 66, nie przetwarzasz czwartego elementu w tablicy, dopóki nie zostanie zakończony. Niestandardowa funkcja sortowania będzie wielokrotnie przechodzić przez tablicę, przesuwając sąsiednie liczby do przodu lub do tyłu, aż wszystko znajdzie się na właściwym miejscu.

Sir_Mapsalot
źródło