Underscore.js'de sıraladığınız dizini almak mümkün mü?


88

JS kitaplığı Underscore kullanıyorum ve özellikle _.eachve _.sortbykitaplık çağrılarını kullanıyorum. Yineleyici temsilcisindeki değerin dizinini almanın olası bir yolu olup olmadığını merak ediyorum.

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

Yanıtlar:


163

Dizin aslında şu şekilde mevcuttur;

_.sortBy([1, 4, 2, 66, 444, 9], function(num, index){  });

Lodash'ın haritası için de çalışıyor
Csaba Toth

6
Ne yazık ki, bu aslında yok değil Lodash en çalışmak sortBymuhtemelen bu senaryoda bilmek daha yararlıdır sürümü 4.17.4, itibariyle.
Jonathan Dumanie'nin

82

Yineleyicinize başka bir parametre ekleyerek mevcut yinelemenin dizinini alabilirsiniz function, örn.

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

19

Dizinizi dönüştürmeyi tercih ederseniz iterator, alt çizgi mapişlevinin parametresi de dizine ikinci bir bağımsız değişken olarak iletilir. Yani:

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

... İadeler:

["0:1", "1:4", "2:2", "3:66", "4:444", "5:9"]

10

Yineleyicisi _.each3 parametre ile çağrılır (element, index, list). Yani evet, _.eachsizin için endeksi alın.

SortBy'de de aynısını yapabilirsiniz


6

Alt Çizgi'nin _.each () işlevinin dahili olarak nasıl çalıştığından bahsetmeye değer olduğunu düşünüyorum. _.Each (liste, yineleme), iletilen listenin bir dizi nesnesi mi yoksa bir nesne mi olduğunu kontrol eder.

Listenin bir dizi olması durumunda, yinelenen bağımsız değişkenler, aşağıdaki örnekte olduğu gibi bir liste öğesi ve dizin olacaktır:

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 .

Öte yandan, liste argümanı bir nesne ise, yineleyici bir liste öğesi ve bir anahtar alacaktır:

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

name mike
lastname doe
age 21

Referans için bu, Underscore.js 1.8.3'ün _.each () kodudur.

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

1

Daha genel olarak, çoğu durumda, ilk iki bağımsız değişken olarak bir liste ve bağımsız değişken alan alt çizgi işlevleri, yineleyicinin son bağımsız değişkeninin yanındaki liste dizinine erişim sağlar. Bu, üçüncü bağımsız değişken olarak 'memo'yu alan iki alt çizgi işlevi olan _.reduce ve _.reduceRight söz konusu olduğunda önemli bir ayrımdır - bu ikisinin durumunda dizin ikinci bağımsız değişken olmayacaktır, ancak üçüncü:

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

İsterseniz Yani kendisi alt çizgi kullanarak dizini alabilir: _.last(_.initial(arguments)). Olası bir istisna (denemedim), liste yerine bir nesneyi alabileceği için _.map olabilir: "Liste bir JavaScript nesnesiyse, yineleyicinin argümanları (değer, anahtar, liste) olacaktır." - bkz: http://underscorejs.org/#map


0

Mümkün olduğunda, çoğu lodash dizisi işlevinin yinelemeyi göstereceğine inanıyorum. Ancak sıralama aslında aynı şekilde bir yineleme değildir: 66 sayısındayken dizideki dördüncü öğeyi tamamlanana kadar işlemiyorsunuz. Özel bir sıralama işlevi, her şey doğru yerine gelene kadar bitişik sayıları ileri veya geri iterek dizide birkaç kez döngü yapar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.