เป็นไปได้ไหมที่จะได้รับดัชนีที่คุณจัดเรียงใน Underscore.js


88

ฉันใช้ขีดล่างไลบรารี JS และโดยเฉพาะอย่างยิ่งการใช้การเรียก_.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){  });

ใช้ได้กับแผนที่ของ lodash ด้วย
Csaba Toth

6
น่าเศร้าที่สิ่งนี้ใช้ไม่ได้จริงใน Lodash sortByในเวอร์ชัน 4.17.4 ซึ่งน่าจะเป็นประโยชน์มากกว่าที่จะทราบในสถานการณ์นี้
Jonathan Dumaine

82

คุณสามารถรับดัชนีของการวนซ้ำปัจจุบันได้โดยการเพิ่มพารามิเตอร์อื่นในตัววนซ้ำของคุณ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

ตัววนซ้ำ_.eachเรียกด้วยพารามิเตอร์ 3 (element, index, list)ตัว ใช่แล้วสำหรับ_.eachคุณรถแท็กซี่รับดัชนี

คุณสามารถทำได้ใน sortBy


6

ฉันคิดว่ามันคุ้มค่าที่จะกล่าวถึงการทำงานของขีดล่าง _.each () ภายใน _.each (list, iteratee) ตรวจสอบว่ารายการที่ส่งผ่านเป็นออบเจ็กต์อาร์เรย์หรือออบเจ็กต์

ในกรณีที่รายการเป็นอาร์เรย์อาร์กิวเมนต์ 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 .

ในทางกลับกันหากอาร์กิวเมนต์รายการเป็นอ็อบเจ็กต์ iteratee จะรับองค์ประกอบรายการและคีย์:

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

name mike
lastname doe
age 21

สำหรับการอ้างอิงนี่คือรหัส _.each () จาก 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;
};

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 เนื่องจากสามารถใช้วัตถุแทนรายการ: "ถ้ารายการเป็นวัตถุ JavaScript อาร์กิวเมนต์ของตัววนซ้ำจะเป็น (ค่าคีย์รายการ)" - ดู: http://underscorejs.org/#map


0

เมื่อพร้อมใช้งานฉันเชื่อว่าฟังก์ชันอาร์เรย์ lodash ส่วนใหญ่จะแสดงการวนซ้ำ แต่การเรียงลำดับไม่ได้เป็นการวนซ้ำในลักษณะเดียวกัน: เมื่อคุณอยู่บนเลข 66 คุณจะไม่ประมวลผลรายการที่สี่ในอาร์เรย์จนกว่าจะเสร็จสิ้น ฟังก์ชันการจัดเรียงแบบกำหนดเองจะวนซ้ำอาร์เรย์หลาย ๆ ครั้งโดยเลื่อนตัวเลขที่อยู่ติดกันไปข้างหน้าหรือข้างหลังจนกว่าทุกอย่างจะอยู่ในตำแหน่งที่เหมาะสม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.