क्या यह संभव है कि आप जिस इंडेक्स को अंडरस्कोर.जेएस में छांट रहे हैं उसे प्राप्त करना संभव है?


88

मैं जेएस लाइब्रेरी अंडरस्कोर और विशेष रूप से _.eachऔर _.sortbyलाइब्रेरी कॉल का उपयोग कर रहा हूं । मैं सोच रहा था कि क्या कोई संभव तरीका है कि इट्रेटर डेलीगेट के भीतर मूल्य का सूचकांक प्राप्त किया जाए

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

जवाबों:


163

सूचकांक वास्तव में उपलब्ध है;

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

लॉश के नक्शे के लिए भी काम करता है
तोथ

6
अफसोस की बात है, यह वास्तव में लोडश के 4.17.4 संस्करण के रूप में काम नहीं करता है sortBy, जो शायद इस परिदृश्य में जानने के लिए अधिक उपयोगी है।
जोनाथन डूमाइन

81

आप अपने पुनरावृत्ति में एक और पैरामीटर जोड़कर वर्तमान पुनरावृत्ति का सूचकांक प्राप्त कर सकते हैं function, जैसे

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

19

यदि आप अपने सरणी को बदलना चाहते हैं, तो iteratorअंडरस्कोर mapफ़ंक्शन के पैरामीटर को भी एक दूसरे तर्क के रूप में सूचकांक पारित किया जाता है। इसलिए:

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

... रिटर्न:

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

10

का इटरेटर _.each3 मापदंडों के साथ कहा जाता है (element, index, list)। तो हाँ, _.eachआप के लिए टैक्सी सूचकांक प्राप्त करें।

आप सॉर्टबाय में भी ऐसा कर सकते हैं


6

मुझे लगता है कि यह उल्लेख के लायक है कि अंडरस्कोर का _.each () आंतरिक रूप से कैसे काम करता है। _.Each (सूची, iteratee) जाँचता है कि पारित सूची एक सरणी ऑब्जेक्ट या ऑब्जेक्ट है।

इस मामले में कि सूची एक सरणी है, पुनरावृति तर्क निम्न उदाहरण के रूप में एक सूची तत्व और सूचकांक होंगे:

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 .

दूसरी ओर, यदि सूची तर्क एक वस्तु है, तो पुनरावृति एक सूची तत्व और एक कुंजी लेगा:

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

name mike
lastname doe
age 21

संदर्भ के लिए यह Underscore.js 1.8.3 से _.each () कोड है

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

आम तौर पर, अधिकांश परिस्थितियों में, अंडरस्कोर फ़ंक्शंस जो पहले दो तर्कों के रूप में एक सूची और तर्क लेते हैं, सूची सूचक को अगले तर्ककर्ता के पास अंतिम तर्क के रूप में पहुंच प्रदान करते हैं। जब यह दो अंडरस्कोर फ़ंक्शन, _.reduce और _.reduceRight की बात आती है, तो यह एक महत्वपूर्ण अंतर है, कि 'मेमो' को उनके तीसरे तर्क के रूप में लें - इन दोनों के मामले में इंडेक्स दूसरा तर्क नहीं होगा, लेकिन तीसरा:

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

तो अगर आप चाहते थे कि आप स्वयं अंडरस्कोर का उपयोग करके सूचकांक प्राप्त कर सकें _.last(_.initial(arguments)):। एक संभावित अपवाद (मैंने कोशिश नहीं की) _.map है, क्योंकि यह एक सूची के बजाय एक वस्तु ले सकता है: "यदि सूची एक जावास्क्रिप्ट वस्तु है, तो इट्रेटर के तर्क (मूल्य, कुंजी, सूची) होंगे।" - देखें: http://underscorejs.org/#map


0

जब उपलब्ध हो, तो मेरा मानना ​​है कि अधिकांश लॉश ऐरे फ़ंक्शंस पुनरावृत्ति दिखाएंगे। लेकिन छंटनी वास्तव में उसी तरह से एक पुनरावृत्ति नहीं है: जब आप संख्या 66 पर होते हैं, तो आप सरणी में चौथे आइटम को संसाधित नहीं कर रहे हैं जब तक कि यह समाप्त नहीं हो जाता। एक कस्टम सॉर्ट फ़ंक्शन एक सरणी के माध्यम से कई बार लूप करेगा, आसन्न संख्याओं को आगे या पीछे की ओर से, जब तक कि सब कुछ उचित स्थान पर न हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.