[javascript] 두 필드로 자바 스크립트 정렬 배열

grouperArray.sort(function (a, b) {
    var aSize = a.gsize;
    var bSize = b.gsize;
    var aLow = a.glow;
    var bLow = b.glow;
    console.log(aLow + " | " + bLow);
    return (aSize < bSize) ? -1 : (aSize > bSize) ? 1 : 0;
});

따라서 위의 코드는 가장 작은 것부터 가장 큰 것까지 gsize별로 배열을 정렬합니다. 잘 작동합니다. 그러나 gsize가 같으면 글로우별로 정렬하고 싶습니다.

감사.



답변

grouperArray.sort(function (a, b) {
    var aSize = a.gsize;
    var bSize = b.gsize;
    var aLow = a.glow;
    var bLow = b.glow;
    console.log(aLow + " | " + bLow);

    if(aSize == bSize)
    {
        return (aLow < bLow) ? -1 : (aLow > bLow) ? 1 : 0;
    }
    else
    {
        return (aSize < bSize) ? -1 : 1;
    }
});


답변

grouperArray.sort(function (a, b) {
    return a.gsize - b.gsize || a.glow - b.glow;
});

짧은 버전


답변

grouperArray.sort((a, b) => a.gsize - b.gsize || a.glow - b.glow);

화살표 구문을 사용하는 더 짧은 버전!


답변

나는 이것이 얼마 전에 요청되었다는 것을 알고 있지만 내 솔루션을 추가 할 것이라고 생각했습니다.

이 함수는 정렬 방법을 동적으로 생성합니다. 오름차순 또는 내림차순을 나타 내기 위해 +/-가 추가 된 정렬 가능한 각 하위 속성 이름을 제공하기 만하면됩니다. 재사용이 매우 가능하며 함께 만든 데이터 구조에 대해 알 필요가 없습니다. 멍청한 증거로 만들 수는 있지만 필요하지 않은 것 같습니다.

function getSortMethod(){
    var _args = Array.prototype.slice.call(arguments);
    return function(a, b){
        for(var x in _args){
            var ax = a[_args[x].substring(1)];
            var bx = b[_args[x].substring(1)];
            var cx;

            ax = typeof ax == "string" ? ax.toLowerCase() : ax / 1;
            bx = typeof bx == "string" ? bx.toLowerCase() : bx / 1;

            if(_args[x].substring(0,1) == "-"){cx = ax; ax = bx; bx = cx;}
            if(ax != bx){return ax < bx ? -1 : 1;}
        }
    }
}

사용 예 :

items.sort (getSortMethod ( ‘-price’, ‘+ priority’, ‘+ name’));

이것은 items가장 낮은 price항목부터 정렬 하고 가장 높은 항목에 연결됩니다 priority. 추가 관계는 항목에 의해 끊어집니다name

항목은 다음과 같은 배열입니다.

var items = [
    { name: "z - test item", price: "99.99", priority: 0, reviews: 309, rating: 2 },
    { name: "z - test item", price: "1.99", priority: 0, reviews: 11, rating: 0.5 },
    { name: "y - test item", price: "99.99", priority: 1, reviews: 99, rating: 1 },
    { name: "y - test item", price: "0", priority: 1, reviews: 394, rating: 3.5 },
    { name: "x - test item", price: "0", priority: 2, reviews: 249, rating: 0.5 } ...
];

라이브 데모 : http://gregtaff.com/misc/multi_field_sort/

수정 : Chrome 문제가 수정되었습니다.


답변

삼항 연산자 ((aSize < bSize) ? -1 : (aSize > bSize) ? 1 : 0;)가 당신을 혼란스럽게 할 것으로 예상합니다 . 더 잘 이해하려면 링크를 확인해야합니다.

그때까지 완전한 if / else 코드는 다음과 같습니다.

grouperArray.sort(function (a, b) {
    if (a.gsize < b.gsize)
    {
        return -1;
    }
    else if (a.gsize > b.gsize)
    {
        return 1;
    }
    else
    {
        if (a.glow < b.glow)
        {
            return -1;
        }
        else if (a.glow > b.glow)
        {
            return 1;
        }
        return 0;
    }
});


답변

다음은 여러 필드에서 작동하는보다 일반적인 것을 원하는 사용자를위한 구현입니다.

Array.prototype.sortBy = function (propertyName, sortDirection) {

    var sortArguments = arguments;
    this.sort(function (objA, objB) {

        var result = 0;
        for (var argIndex = 0; argIndex < sortArguments.length && result === 0; argIndex += 2) {

            var propertyName = sortArguments[argIndex];
            result = (objA[propertyName] < objB[propertyName]) ? -1 : (objA[propertyName] > objB[propertyName]) ? 1 : 0;

            //Reverse if sort order is false (DESC)
            result *= !sortArguments[argIndex + 1] ? 1 : -1;
        }
        return result;
    });

}

기본적으로 속성 이름 / 정렬 방향을 얼마든지 지정할 수 있습니다.

var arr = [{
  LastName: "Doe",
  FirstName: "John",
  Age: 28
}, {
  LastName: "Doe",
  FirstName: "Jane",
  Age: 28
}, {
  LastName: "Foo",
  FirstName: "John",
  Age: 30
}];

arr.sortBy("LastName", true, "FirstName", true, "Age", false);
//Will return Jane Doe / John Doe / John Foo

arr.sortBy("Age", false, "LastName", true, "FirstName", false);
//Will return John Foo / John Doe / Jane Doe


답변

grouperArray.sort(function (a, b) {
  var aSize = a.gsize;
  var bSize = b.gsize;
  var aLow = a.glow;
  var bLow = b.glow;
  console.log(aLow + " | " + bLow);
  return (aSize < bSize) ? -1 : (aSize > bSize) ? 1 : ( (aLow < bLow ) ? -1 : (aLow > bLow ) ? 1 : 0 );
});