lodash sắp xếp nhiều cộtBạn giảm dần


151

Có một phương pháp tiện lợi để sắp xếp một mảng các đối tượng dựa trên một số thuộc tính:

var data = _.sortBy(array_of_objects, ['type', 'name']);

Tuy nhiên, đó chỉ là để sắp xếp tăng dần. Có một số cách hữu ích để xác định hướng trên mỗi cột? Ví dụ

var data = _.sortBy(array_of_objects, [{'type': 'asc'}, {'name': 'desc'}]);

Câu trả lời:


329

Kể từ lodash 3.5.0, bạn có thể sử dụng sortByOrder (được đổi tên thành orderBy trong v4.3.0):

var data = _.sortByOrder(array_of_objects, ['type','name'], [true, false]);

Kể từ phiên bản 3.10.0, bạn thậm chí có thể sử dụng ngữ nghĩa tiêu chuẩn để đặt hàng (asc, desc):

var data = _.sortByOrder(array_of_objects, ['type','name'], ['asc', 'desc']);

Trong phiên bản 4 của lodash, phương thức này đã được đổi tên thành orderBy :

var data = _.orderBy(array_of_objects, ['type','name'], ['asc', 'desc']);

7
Đối với bạn thông tin, chức năng này đã được đổi tên thành _.orderBy ( lodash.com/docs#orderBy ) trong Lodash kể từ 4.3.0. Hàm sắp xếp bình thường được gọi là _.sortBy ( lodash.com/docs#sortBy )
Nidhin David

2
Tôi đang nhận được _.sortByOrder is not a functiontrong phiên bản mới nhất của lodash.
chovy

66
Tại sao lodash tiếp tục đổi tên các chức năng?
Kenny Worden

13
Phần , ['asc', 'desc']này chỉ bị bỏ qua cho tôi với lodash@4.17.10. Tất cả mọi thứ chỉ được sắp xếp tăng dần.
maninak

4
@maninak Cái này dành cho _.sortBy. Hãy thử _.orderBythay thế. Hi vọng điêu nay co ich.
pcasme

45

Bạn luôn có thể sử dụng Array.prototype.reverse()

var data = _.sortBy(array_of_objects, ['type', 'name']).reverse();

ha mà thông minh. đối với một cách sắp xếp số tăng dần (lodash mặc định giảm dần) Tôi đã sử dụng cách này: _.sortBy (mảng_of_objects, "some_numerical_value_key"). Reverse ()
devonj

3
Mặc dù đủ tốt cho một số trường hợp, tác dụng của việc này là sắp xếp giảm dần trên các cột CẢ, đó không phải là những gì câu hỏi yêu cầu.
Inkling

Hãy đề nghị một câu trả lời? stackoverflow.com/questions/62611361/ móc
Reacg garav

14

Điều đáng chú ý là nếu bạn muốn sắp xếp các thuộc tính cụ thể giảm dần, bạn không muốn chỉ đơn giản là nối thêm .reverse () vào cuối, vì điều này sẽ làm cho tất cả các loại giảm dần.

Để thực hiện các loại cụ thể giảm dần, xâu chuỗi các loại của bạn từ ít quan trọng nhất đến quan trọng nhất, gọi .reverse () sau mỗi loại mà bạn muốn giảm dần.

var data = _(data).chain()
    .sort("date")
    .reverse()    // sort by date descending
    .sort("name") // sort by name ascending
    .result()

Vì sắp xếp của _ là một loại ổn định, bạn có thể xâu chuỗi và đảo ngược một cách an toàn bởi vì nếu hai mặt hàng có cùng giá trị cho một tài sản, thứ tự của chúng sẽ được giữ nguyên.

Thêm thông tin


Nếu bạn không có đủ đại diện để bình luận, đừng bình luận. Mặc dù bạn đã đưa ra một câu trả lời thực tế, điều này rất tốt, nhưng bạn thậm chí không cần phải đề cập đến thực tế đó.
ArtOfCode

Hãy đề nghị một câu trả lời? stackoverflow.com/questions/62611361/ móc
Reacg garav

13

Trường sâu & đa trường & hướng khác nhau Đặt hàng Lodash> 4

var sortedArray = _.orderBy(mixedArray,
                            ['foo','foo.bar','bar.foo.bar'],               
                            ['desc','asc','desc']);

Trên thực tế đây sẽ là câu trả lời ngay bây giờ. sortBy không cung cấp cho bạn hướng, nhưng orderBy thì không.
Pablo Palacios

Hãy đề nghị một câu trả lời? stackoverflow.com/questions/62611361/ móc
Reacg garav

5

Có một số cách hữu ích để xác định hướng trên mỗi cột?

Không. Bạn không thể chỉ định thứ tự sắp xếp khác ngoài chức năng gọi lại đảo ngược giá trị. Thậm chí điều này là không thể đối với một loại nhiều màu.

Bạn có thể làm được

 _.each(array_of_objects, function(o) {
     o.typeDesc = -o.type; // assuming a number
 });
 _.sortBy(array_of_objects, ['typeDesc', 'name'])

Đối với mọi thứ khác, bạn sẽ cần phải sử dụng .sort()chức năng so sánh tùy chỉnh:

 array_of_objects.sort(function(a, b) {
     return a.type - b.type // asc
         || +(b.name>a.name)||-(a.name>b.name) // desc
         || …;
 });

3

Trong tài liệu của phiên bản 4.11.x, nói: "" Phương thức này giống như _.sortBy ngoại trừ việc nó cho phép chỉ định các thứ tự sắp xếp của các lần lặp để sắp xếp theo. Nếu các lệnh không được chỉ định, tất cả các giá trị được sắp xếp theo thứ tự tăng dần. , chỉ định một thứ tự "desc" cho giảm dần hoặc "asc" cho thứ tự sắp xếp tăng dần của các giá trị tương ứng. " (nguồn https://lodash.com/docs/4.17.10#orderBy )

let sorted = _.orderBy(this.items, ['fieldFoo', 'fieldBar'], ['asc', 'desc'])


Tôi nghĩ bạn có ý định sử dụng _.sortByOrder?
AJ Richardson

không thể tìm thấy biến _
Vishal Vaghasiya

Hãy đề nghị một câu trả lời? stackoverflow.com/questions/62611361/ móc
Reacg garav

0

Bạn cũng có thể thử điều này:

var data= _.reverse(_.sortBy(res.locals.subscriptionList.items, ['type', 'name']));

Điều này sẽ diễn ra chậm hơn so với việc chỉ sử dụng _.orderBy
reggaeg Ức
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.