2017-02-02 8 views
0

그래서 밑줄 sortBy를 사용했으며 가장 저렴한 비용으로 JSON 객체 배열을 정렬하고 있습니다 ... 어느 것이 좋습니다.밑줄 : sortBy 최저 가격이 두 개 이상 또는 같은 가격이 아니라면 sortBy date ... 등

"두 개 이상의 결과이 같은 비용의 경우 다음 컬렉션 포인트의 순서는 다음과 같은 우선 순위에 있어야한다 (첫번째 최고 우선 순위)

최저 :

은 무엇 클라이언트는 원하는 것은 이것이다 가격 (기본) - 고유 가격의 경우 검색 위치로부터의 거리 가장 빠른 수집 날짜 "

이렇게 할 수 있나요?

당신이 있다면 10 개 항목과 2의 목록은 £ 1, 2 £ 2, 2 £ 3, 2 £ 4, 2 £ 5 이 종료하지 않을 수 있습니다입니다입니다입니다입니다 일종의 우선 순위를 알아 내려고 미쳤어 요?

+0

가능한 여러 개의 [Underscore : sortBy() 여러 속성을 기반으로] (http://stackoverflow.com/questions/16426774/underscore-sortby-based-on-multiple-attributes) –

답변

0

this answer to a (very) similar question을 살펴보십시오. 당신이 사용자 정의 비교를 설정할 수 있기 때문에

var fullySorted = _.sortBy((_.sortBy(list, 'collectionDate')), 'price'); 

또는

var fullySorted = _.chain(list).sortBy('collectionDate').sortBy('price').value(); 
0

이것은, 실제로 Array.prototype.sort를 사용하는 것을 선호 경우입니다 : 간단한 버전, courtesy of Janet Riley도 있습니다

함수를 사용하면 다중 패스를 사용하지 않고 배열을 정렬하거나 hacky workarounds를 사용할 수 있습니다.

다음은 비교할 여러 함수 (또는 속성)를 지정할 수있는 비교적 간단한 비교기 구현입니다. 두 개체가 한 함수에 따라 같으면 다음 함수가 사용됩니다.

const items = [{ 
 
    cost: 1, 
 
    prioritiy: 1 
 
}, { 
 
    cost: 2, 
 
    prioritiy: 1 
 
}, { 
 
    cost: 1, 
 
    prioritiy: 2 
 
}]; 
 
items.sort(by('cost', 'priority')); 
 
console.log(items); 
 

 
function by(...args) { 
 
    const funcs = args.map(arg => 
 
    typeof arg === 'function' ? arg : obj => obj[arg] 
 
); 
 
    const compare = (val1, val2) => { 
 
    return typeof val1 === 'string' && 
 
      typeof val2 === 'string' 
 
      ? val1.localeCompare(val2) 
 
      : val1 - val2; 
 
    }; 
 
    return (a, b) => { 
 
    for (let i = 0; i < funcs.length; i++) { 
 
     let comp = compare(funcs[i](a), funcs[i](b)); 
 
     if (comp !== 0) { 
 
     return comp; 
 
     } 
 
    } 
 
    return 0; 
 
    }; 
 
}

또한 Lodash이 문제와 _.sortBy을 갖는다 밑줄 대안 라이브러리이다.