Có thể lấy chỉ mục bạn đang sắp xếp trong Underscore.js không?


88

Tôi đang sử dụng Dấu gạch dưới thư viện JS và cụ thể là sử dụng các lệnh gọi _.each_.sortbythư viện. Tôi tự hỏi liệu có cách nào khả thi để lấy chỉ mục của giá trị trong đại biểu trình lặp không

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

Câu trả lời:


163

Chỉ mục thực sự có sẵn như;

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

Làm việc cho bản đồ lodash cũng
Csaba Toth

6
Đáng buồn thay, điều này thực sự không hoạt động trong Lodash sortBykể từ phiên bản 4.17.4, điều này có lẽ hữu ích hơn nếu biết trong trường hợp này.
Jonathan Dumaine,

81

Bạn có thể lấy chỉ mục của lần lặp hiện tại bằng cách thêm một tham số khác vào trình lặp của bạn function, ví dụ:

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

19

Nếu bạn muốn chuyển đổi mảng của mình, thì iteratortham số của maphàm gạch dưới cũng được chuyển vào chỉ mục dưới dạng đối số thứ hai. Vì thế:

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

... trả về:

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

10

Trình lặp của _.eachđược gọi với 3 tham số (element, index, list). Vì vậy, có, cho _.eachbạn taxi lấy chỉ mục.

Bạn có thể làm tương tự trong sortBy


6

Tôi nghĩ điều đáng nói là cách _.each () của Underscore hoạt động bên trong. _.Each (list, iteratee) kiểm tra xem danh sách đã truyền là một đối tượng mảng hay một đối tượng.

Trong trường hợp danh sách là một mảng, các đối số lặp sẽ là một phần tử danh sách và chỉ mục như trong ví dụ sau:

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 .

Mặt khác, nếu đối số danh sách là một đối tượng, trình lặp sẽ lấy một phần tử danh sách và một khóa:

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

name mike
lastname doe
age 21

Để tham khảo, đây là mã _.each () từ 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

Nói một cách tổng quát hơn, trong hầu hết các trường hợp, các hàm gạch dưới lấy danh sách và đối số làm hai đối số đầu tiên, cung cấp quyền truy cập vào chỉ mục danh sách như đối số bên cạnh đối số cuối cùng cho trình lặp. Đây là một điểm khác biệt quan trọng khi nói đến hai hàm gạch dưới, _.reduce và _.reduceRight, lấy 'memo' làm đối số thứ ba - trong trường hợp của hai hàm này, chỉ mục sẽ không phải là đối số thứ hai, mà là ngày thứ ba:

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

Vì vậy, nếu bạn muốn bạn có thể nhận được các chỉ số sử dụng dấu gạch dưới bản thân: _.last(_.initial(arguments)). Một ngoại lệ có thể xảy ra (tôi chưa thử) là _.map, vì nó có thể lấy một đối tượng thay vì một danh sách: "Nếu danh sách là một đối tượng JavaScript, các đối số của trình lặp sẽ là (giá trị, khóa, danh sách)." - xem: http://underscorejs.org/#map


0

Khi có sẵn, tôi tin rằng hầu hết các hàm mảng lodash sẽ hiển thị sự lặp lại. Nhưng sắp xếp thực sự không phải là một sự lặp lại theo cùng một cách: khi bạn đang ở số 66, bạn sẽ không xử lý mục thứ tư trong mảng cho đến khi nó kết thúc. Một hàm sắp xếp tùy chỉnh sẽ lặp qua một mảng một số lần, di chuyển các số liền kề về phía trước hoặc phía sau, cho đến khi mọi thứ ở đúng vị trí của nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.