lodash 다중 열 정렬


151

여러 속성을 기반으로 객체 배열을 정렬하는 멋진 방법이 있습니다.

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

그러나 오름차순 정렬에만 해당됩니다. 열당 방향을 정의하는 편리한 방법이 있습니까? 예 :

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

답변:


330

현재 lodash 3.5.0 사용할 수 sortByOrder을 (개명 해 orderBy를 V4.3.0에서) :

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

버전 3.10.0 부터 주문시 표준 시맨틱 (asc, desc)을 사용할 수 있습니다.

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

에서 버전 4 lodash이 방법이 변경되었습니다 해 orderBy :

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

7
참고로이 기능의 이름은 Lodash 에서 4.3.0 부터 _.orderBy ( lodash.com/docs#orderBy ) 로 바뀌 었습니다 . 일반적인 정렬 함수는 _.sortBy ( lodash.com/docs#sortBy )
Nidhin David

2
나는군요 _.sortByOrder is not a functionlodash의 최신 버전.
chovy

66
lodash가 왜 이름 변경 기능을 유지합니까?
Kenny Worden 2016 년

13
, ['asc', 'desc']부분은 lodash@4.17.10 나를 무시지고 있습니다. 모든 것이 오름차순으로 정렬됩니다.
maninak

4
@maninak입니다 _.sortBy. _.orderBy대신 시도하십시오 . 도움이 되었기를 바랍니다.
pcasme

45

당신은 항상 사용할 수 있습니다 Array.prototype.reverse()

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

하 영리하다. 숫자 정렬 오름차순 (lodash 기본값은 내림차순)에 이것을 사용했습니다 : _.sortBy (array_of_objects, "some_numerical_value_key"). reverse ()
devonj

3
어떤 경우에는 충분하지만 이것의 효과는 BOTH 열에서 내림차순으로 정렬하는 것입니다.
Inkling

답변을 제안 하시겠습니까? stackoverflow.com/questions/62611489/…
reacg garav

14

특정 속성을 내림차순으로 정렬하려면 끝에 모든 .reverse ()를 추가하지 않으려는 경우 모든 정렬이 내림차순으로 표시되므로주의해야합니다.

특정 정렬을 내림차순으로 만들려면 내림차순하려는 각 정렬 후에 .reverse ()를 호출하여 정렬을 가장 중요하지 않은 순서에서 가장 중요한 순서로 연결하십시오.

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

_의 정렬은 안정적인 정렬이므로 두 항목의 속성 값이 같으면 순서가 유지되므로 정렬을 안전하게 연결하고 역순으로 정렬 할 수 있습니다.

추가 정보


댓글을 작성할 담당자가 충분하지 않으면 댓글을 달지 마세요. 비록 당신이 이것을 실제 답변으로 만들어 냈지만, 그 사실을 언급 할 필요조차 없습니다.
ArtOfCode

답변을 제안 하시겠습니까? stackoverflow.com/questions/62611489/…
reacg garav


5

열당 방향을 정의하는 편리한 방법이 있습니까?

아니요. 값을 반전시키는 콜백 함수 이외의 정렬 순서는 지정할 수 없습니다. 다중 열 정렬에서는 이것이 불가능합니다.

당신은 할 수 있습니다

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

그 밖의 모든 것에 .sort()는 사용자 정의 비교 기능 을 사용하여 네이티브에 의존해야 합니다.

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

3

버전 4.11.x의 문서에서 다음과 같이 말합니다.` "이 방법은 _.sortBy와 유사합니다. 반복의 정렬 순서를 기준으로 정렬 할 수 있습니다. 순서를 지정하지 않으면 모든 값이 오름차순으로 정렬됩니다. , 내림차순은 "desc", 해당 값의 오름차순 정렬은 "asc"순서를 지정하십시오. " (출처 https://lodash.com/docs/4.17.10#orderBy )

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


당신이 사용하려고 생각 _.sortByOrder하십니까?
AJ Richardson

변수를 찾을 수 없습니다 _
Vishal Vaghasiya

답변을 제안 하시겠습니까? stackoverflow.com/questions/62611489/…
reacg garav

0

당신은 또한 이것을 시도 할 수 있습니다 :

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

이것은 _.orderBy를 사용하는 것보다 느리게 진행될 것입니다.
reggaeguitar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.