Ist es möglich, den Index, nach dem Sie sortieren, in Underscore.js abzurufen?

88

Ich verwende die JS-Bibliothek Unterstrich und insbesondere die Aufrufe _.eachund _.sortbyBibliothek. Ich frage mich, ob es eine Möglichkeit gibt, den Index des Werts innerhalb des Iterator-Delegaten abzurufen

_.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); 
});
Kontaktmatt
quelle

Antworten:

163

Index ist tatsächlich verfügbar wie;

_.sortBy([1, 4, 2, 66, 444, 9], function(num, index){  });
Osoner
quelle
Funktioniert auch für lodashs Karte
Csaba Toth
6
Leider ist dies eigentlich nicht arbeitet in Lodash des sortByab der Version 4.17.4, die wahrscheinlich hilfreicher ist in diesem Szenario zu kennen.
Jonathan Dumaine
81

Sie können den Index der aktuellen Iteration abrufen function, indem Sie Ihrem Iterator einen weiteren Parameter hinzufügen , z

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

Wenn Sie Ihr Array lieber transformieren möchten, wird dem iteratorParameter der mapFunktion des Unterstrichs auch der Index als zweites Argument übergeben. So:

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

... kehrt zurück:

["0:1", "1:4", "2:2", "3:66", "4:444", "5:9"]
Martin Dow
quelle
10

Der Iterator von _.eachwird mit 3 Parametern aufgerufen (element, index, list). Also ja, für _.eachSie können Sie den Index bekommen.

Sie können dasselbe in sortBy tun

Janith
quelle
6

Ich denke, es ist erwähnenswert, wie _.each () des Unterstrichs intern funktioniert. Das _.each (Liste, Iterat) prüft, ob die übergebene Liste ein Array-Objekt oder ein Objekt ist.

In dem Fall, dass die Liste ein Array ist, sind iterierte Argumente ein Listenelement und ein Index wie im folgenden Beispiel:

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 .

Wenn das Listenargument hingegen ein Objekt ist, nimmt der Iterat ein Listenelement und einen Schlüssel:

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

name mike
lastname doe
age 21

Als Referenz ist dies der Code _.each () aus 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
quelle
1

Unter den meisten Umständen bieten Unterstrichfunktionen, die eine Liste und ein Argument als erste beiden Argumente verwenden, dem Iterator Zugriff auf den Listenindex als vorletztes Argument. Dies ist eine wichtige Unterscheidung, wenn es um die beiden Unterstrichfunktionen _.reduce und _.reduceRight geht, die 'memo' als drittes Argument verwenden - bei diesen beiden ist der Index nicht das zweite Argument, sondern das dritte:

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(','));
*/

Wenn Sie möchten, können Sie den Index mit dem Unterstrich selbst abrufen : _.last(_.initial(arguments)). Eine mögliche Ausnahme (ich habe es nicht versucht) ist _.map, da ein Objekt anstelle einer Liste verwendet werden kann: "Wenn list ein JavaScript-Objekt ist, lauten die Argumente des Iterators (Wert, Schlüssel, Liste)." - siehe: http://underscorejs.org/#map

Sauerstoff
quelle
0

Wenn verfügbar, glaube ich, dass die meisten Lodash-Array-Funktionen die Iteration anzeigen. Das Sortieren ist jedoch nicht wirklich eine Iteration auf die gleiche Weise: Wenn Sie sich auf der Nummer 66 befinden, verarbeiten Sie das vierte Element im Array erst, wenn es fertig ist. Eine benutzerdefinierte Sortierfunktion durchläuft ein Array mehrmals und stößt benachbarte Zahlen vorwärts oder rückwärts an, bis sich alles an der richtigen Stelle befindet.

Sir_Mapsalot
quelle