속성 값을 기준으로 객체 배열 정렬


1331

AJAX를 사용하여 다음 객체를 가져 와서 배열에 저장했습니다.

var homes = [
    {
        "h_id": "3",
        "city": "Dallas",
        "state": "TX",
        "zip": "75201",
        "price": "162500"
    }, {
        "h_id": "4",
        "city": "Bevery Hills",
        "state": "CA",
        "zip": "90210",
        "price": "319250"
    }, {
        "h_id": "5",
        "city": "New York",
        "state": "NY",
        "zip": "00010",
        "price": "962500"
    }
];

JavaScript 만 사용하여 price속성 별로 오름차순 또는 내림차순 으로 객체를 정렬하는 함수를 작성하는 방법은 무엇입니까?


가장 빠른 방법은 브라우저와 노드 모두에서 기본적으로 작동하는 모든 유형의 입력, 계산 필드 및 사용자 정의 정렬 순서를 지원 하는 동형 정렬 배열 모듈 을 사용하는 것 입니다.
Lloyd

답변:


1674

가격을 기준으로 오름차순으로 집 정렬 :

homes.sort(function(a, b) {
    return parseFloat(a.price) - parseFloat(b.price);
});

또는 ES6 버전 이후 :

homes.sort((a, b) => parseFloat(a.price) - parseFloat(b.price));

일부 설명서는 여기 에서 찾을 수 있습니다 .


182
string1.localeCompare(string2)문자열 비교에 사용할 수 있습니다
bradvido

62
명심 localeCompare()경우입니다 문자를 구분 . 대소 문자를 구분하려면을 사용할 수 있습니다 (string1 > string2) - (string1 < string2). 부울 값은 정수 0과 1로 강제 변환되어 차이를 계산합니다.
돈 커크비

2
@Pointy 업데이트에 감사드립니다.이 문제가 발생한 것을 기억하지 못하지만 지난 몇 년 동안 동작이 변경되었을 수 있습니다. 어쨌든 localeCompare()설명서 에는 대 / 소문자 구분, 숫자 정렬 및 기타 옵션을 원하는지 여부를 명시 적으로 명시 할 수있는 것으로 나와 있습니다.
돈 커크비

2
@ sg28 MDN 설명을 잘못 이해했다고 생각합니다. 정렬 기능이 신뢰할 수 없다고 말하지 않고 , 안정적 이지 않다고 말합니다 . 나는 이것이 왜 혼란 스러울 수 있는지 이해하지만 그것이 사용하기에 적합하지 않다는 주장은 아닙니다. 정렬 알고리즘의 맥락에서 안정적인 용어 는 목록에서 "동일한"요소가 입력과 동일한 순서로 정렬된다는 특정 의미를 갖습니다 . 이것은 불안정한 코드 아이디어와는 전혀 관련이 없습니다 (즉, 아직 사용할 준비가되지 않았습니다).
Stobor

1
예를 들어 도시별로 특정 문자열 값을 기준으로 정렬하려면 다음을 사용할 수 있습니다. this.homes.sort ((current, next) => {return current.city.localeCompare (next.city)});
Jorge Valvert

675

다음은 재사용 가능한 정렬 함수를 만들고 필드별로 정렬 할 수있는보다 유연한 버전입니다.

const sort_by = (field, reverse, primer) => {

  const key = primer ?
    function(x) {
      return primer(x[field])
    } :
    function(x) {
      return x[field]
    };

  reverse = !reverse ? 1 : -1;

  return function(a, b) {
    return a = key(a), b = key(b), reverse * ((a > b) - (b > a));
  }
}


//Now you can sort by any field at will...

const homes=[{h_id:"3",city:"Dallas",state:"TX",zip:"75201",price:"162500"},{h_id:"4",city:"Bevery Hills",state:"CA",zip:"90210",price:"319250"},{h_id:"5",city:"New York",state:"NY",zip:"00010",price:"962500"}];

// Sort by price high to low
console.log(homes.sort(sort_by('price', true, parseInt)));

// Sort by city, case-insensitive, A-Z
console.log(homes.sort(sort_by('city', false, (a) =>  a.toUpperCase()
)));


7
nickb-코드를 잘못 읽고 있습니다. sort_byO (1)에서 실행되며 내장 정렬 (O (N log N))에서 목록의 항목을 비교하는 데 사용되는 함수를 반환합니다. 총 복잡도는 O (n log n) * O (1)이며, 이는 O (n log n)로 감소하거나 빠른 정렬과 동일합니다.
Triptych

1
내가 가지고있는 한 가지 문제는 reverse = false로 숫자를 1,2,3,4로 정렬하지만 문자열은 z, y, x로 정렬한다는 것입니다.
Abby

4
작은 향상 :var key = primer ? function (x) { return primer(x[field]); } : function (x) { return x[field]; }
ErikE

6
동안 [1,-1][+!!reverse]외모 냉각, 그것은 할 수있는 끔찍한 일이다. 사용자가 메소드를 올바르게 호출 할 수없는 경우, 어떤 식 으로든 그 방법을 이해하려고 시도하지 말고 처벌하십시오.
Ingo Bürk

2
소스 데이터를 준비하는 것이 좋지 않을 것입니다. 소스 데이터를 약간 조정해야 할 경우 연속적인 구문 분석이 발생할 수 있습니다.
Gerrit Brink

134

정렬하려면 두 개의 인수를 사용하는 비교기 함수를 작성해야합니다. 그런 다음 다음과 같이 해당 비교기 함수를 사용하여 정렬 함수를 호출하십시오.

// a and b are object elements of your array
function mycomparator(a,b) {
  return parseInt(a.price, 10) - parseInt(b.price, 10);
}
homes.sort(mycomparator);

오름차순으로 정렬하려면 빼기 부호의 양쪽에있는 표현식을 전환하십시오.


3
그리고 여기에 "너무 복잡해서 이해가 안된다"고 말하는 대신에 주제를 실제로 설명하는 참고 문헌이 있습니다 : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Roland Illig

51

필요하다면 문자열 정렬을 위해

const dataArr = {

  "hello": [{
    "id": 114,
    "keyword": "zzzzzz",
    "region": "Sri Lanka",
    "supportGroup": "administrators",
    "category": "Category2"
  }, {
    "id": 115,
    "keyword": "aaaaa",
    "region": "Japan",
    "supportGroup": "developers",
    "category": "Category2"
  }]

};
const sortArray = dataArr['hello'];

console.log(sortArray.sort((a, b) => {
  if (a.region < b.region)
    return -1;
  if (a.region > b.region)
    return 1;
  return 0;
}));


38

ES6 호환 브라우저 가있는 경우 다음을 사용할 수 있습니다.

오름차순 정렬과 내림차순 정렬의 차이점은 비교 함수에서 반환 된 값의 부호입니다.

var ascending = homes.sort((a, b) => Number(a.price) - Number(b.price));
var descending = homes.sort((a, b) => Number(b.price) - Number(a.price));

작동하는 코드 스 니펫은 다음과 같습니다.

var homes = [{
  "h_id": "3",
  "city": "Dallas",
  "state": "TX",
  "zip": "75201",
  "price": "162500"
}, {
  "h_id": "4",
  "city": "Bevery Hills",
  "state": "CA",
  "zip": "90210",
  "price": "319250"
}, {
  "h_id": "5",
  "city": "New York",
  "state": "NY",
  "zip": "00010",
  "price": "962500"
}];

homes.sort((a, b) => Number(a.price) - Number(b.price));
console.log("ascending", homes);

homes.sort((a, b) => Number(b.price) - Number(a.price));
console.log("descending", homes);


22

자바 스크립트로 정렬 하시겠습니까? 당신이 원하는 것은 sort()기능 입니다. 이 경우 비교기 함수를 작성하여 sort()다음과 같이 전달해야합니다 .

function comparator(a, b) {
    return parseInt(a["price"], 10) - parseInt(b["price"], 10);
}

var json = { "homes": [ /* your previous data */ ] };
console.log(json["homes"].sort(comparator));

비교기는 배열 내부의 각 중첩 해시 중 하나를 가져 와서 "price"필드를 확인하여 더 높은 값을 결정합니다.


21

GitHub를 추천합니다 : Array sortBy - Schwartzian 변환sortBy 을 사용 하는 최상의 방법 구현

그러나 지금은 Gist : sortBy-old.js 접근 방식을 시도 할 것 입니다.
속성을 기준으로 객체를 정렬 할 수있는 배열을 정렬하는 메서드를 만들어 보겠습니다.

정렬 기능 만들기

var sortBy = (function () {
  var toString = Object.prototype.toString,
      // default parser function
      parse = function (x) { return x; },
      // gets the item to be sorted
      getItem = function (x) {
        var isObject = x != null && typeof x === "object";
        var isProp = isObject && this.prop in x;
        return this.parser(isProp ? x[this.prop] : x);
      };

  /**
   * Sorts an array of elements.
   *
   * @param  {Array} array: the collection to sort
   * @param  {Object} cfg: the configuration options
   * @property {String}   cfg.prop: property name (if it is an Array of objects)
   * @property {Boolean}  cfg.desc: determines whether the sort is descending
   * @property {Function} cfg.parser: function to parse the items to expected type
   * @return {Array}
   */
  return function sortby (array, cfg) {
    if (!(array instanceof Array && array.length)) return [];
    if (toString.call(cfg) !== "[object Object]") cfg = {};
    if (typeof cfg.parser !== "function") cfg.parser = parse;
    cfg.desc = !!cfg.desc ? -1 : 1;
    return array.sort(function (a, b) {
      a = getItem.call(cfg, a);
      b = getItem.call(cfg, b);
      return cfg.desc * (a < b ? -1 : +(a > b));
    });
  };

}());

정렬되지 않은 데이터 설정

var data = [
  {date: "2011-11-14T16:30:43Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T17:22:59Z", quantity: 2, total: 90,  tip: 0,   type: "Tab"},
  {date: "2011-11-14T16:28:54Z", quantity: 1, total: 300, tip: 200, type: "visa"},
  {date: "2011-11-14T16:53:41Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T16:48:46Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T17:25:45Z", quantity: 2, total: 200, tip: 0,   type: "cash"},
  {date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "Visa"},
  {date: "2011-11-14T16:58:03Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T16:20:19Z", quantity: 2, total: 190, tip: 100, type: "tab"},
  {date: "2011-11-01T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab"},
  {date: "2011-11-14T17:07:21Z", quantity: 2, total: 90,  tip: 0,   type: "tab"},
  {date: "2011-11-14T16:54:06Z", quantity: 1, total: 100, tip: 0,   type: "Cash"}
];

그것을 사용하여

배열을 다음 "date"과 같이 정렬하십시오.String

// sort by @date (ascending)
sortBy(data, { prop: "date" });

// expected: first element
// { date: "2011-11-01T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab" }

// expected: last element
// { date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "Visa"}

대소 문자를 구분하지 않으려면 parser콜백을 설정하십시오 .

// sort by @type (ascending) IGNORING case-sensitive
sortBy(data, {
    prop: "type",
    parser: (t) => t.toUpperCase()
});

// expected: first element
// { date: "2011-11-14T16:54:06Z", quantity: 1, total: 100, tip: 0, type: "Cash" }

// expected: last element
// { date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "Visa" }

"date"필드를 Date유형 으로 변환하려면 다음을 수행하십시오.

// sort by @date (descending) AS Date object
sortBy(data, {
    prop: "date",
    desc: true,
    parser: (d) => new Date(d)
});

// expected: first element
// { date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "Visa"}

// expected: last element
// { date: "2011-11-01T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab" }

다음 코드로 재생할 수 있습니다 : jsbin.com/lesebi

감사 @Ozesh 그 피드백에 의해이 특성과 관련된 문제 falsy 값으로 고정 하였다.


필드가 null 인 경우 중단되는 것 같습니다.
TSNev

: 만일 당신이 번호를 통해 분류하고 있고 객체의 배열 사이에 '0'가 발생, 당신은 위의 코드를 나누기 .. 여기에 대한 빠른 수정 것을 알 수 있습니다 var checkNaN = function (value) { return Number.isNaN(Number(value)) ? 0 : value; } {리턴 기능 (배열, O) : 다음은 .... a = _getItem.call (o, a); a = checkNaN (a); b = _getItem.call (o, b); b = checkNaN (b); o.desc를 반환 * (a <b? -1 : + (a> b)); });
Ozesh

18

lodash.sortBy 사용하십시오 ( commonjs를 사용하는 지침 은 HTML 상단에 cdn에 대한 스크립트 include-tag를 넣을 수도 있습니다 )

var sortBy = require('lodash.sortby');
// or
sortBy = require('lodash').sortBy;

내림차순

var descendingOrder = sortBy( homes, 'price' ).reverse();

오름차순

var ascendingOrder = sortBy( homes, 'price' );

1
또는const sortBy = require('lodash/sortBy'); let calendars = sortBy(calendarListResponse.items, cal => cal.summary);
mpen

확실하지 loadash는 이제 이름이있는 OrderBy 최근에 변경 한 경우import { orderBy } from 'lodash'; ... ... return orderBy ( rows, 'fieldName' ).reverse();
montelof

8

이것은 간단한 한 줄의 valueof () 정렬 함수를 통해 달성 할 수있었습니다 . 데모를 보려면 아래 코드 스 니펫을 실행하십시오.

var homes = [
    {
        "h_id": "3",
        "city": "Dallas",
        "state": "TX",
        "zip": "75201",
        "price": "162500"
    }, {
        "h_id": "4",
        "city": "Bevery Hills",
        "state": "CA",
        "zip": "90210",
        "price": "319250"
    }, {
        "h_id": "5",
        "city": "New York",
        "state": "NY",
        "zip": "00010",
        "price": "962500"
    }
];

console.log("To sort descending/highest first, use operator '<'");

homes.sort(function(a,b) { return a.price.valueOf() < b.price.valueOf();});

console.log(homes);

console.log("To sort ascending/lowest first, use operator '>'");

homes.sort(function(a,b) { return a.price.valueOf() > b.price.valueOf();});

console.log(homes);


8

나는 파티에 조금 늦었지만 아래는 정렬의 논리입니다.

function getSortedData(data, prop, isAsc) {
    return data.sort((a, b) => {
        return (a[prop] < b[prop] ? -1 : 1) * (isAsc ? 1 : -1)
    });
}

6

OP가 숫자 배열을 정렬하려고한다는 것을 알고 있지만이 질문은 문자열과 관련된 비슷한 질문에 대한 답변으로 표시되었습니다. 사실, 위의 답변은 대소 문자가 중요한 텍스트 배열을 정렬하는 것을 고려하지 않습니다. 대부분의 답변은 문자열 값을 사용하여 대문자 / 소문자로 변환 한 다음 한 가지 방법으로 정렬합니다. 내가 준수하는 요구 사항은 간단합니다.

  • 알파벳순으로 AZ 정렬
  • 같은 단어의 대문자 값은 소문자 값 앞에 와야합니다
  • 동일한 문자 (A / a, B / b) 값을 함께 그룹화해야합니다

내가 기대하는 것은 [ A, a, B, b, C, c ]위의 답변이 돌아옵니다 A, B, C, a, b, c. 나는 실제로 내가 원하는 것보다 더 오랫동안 이것에 대해 머리를 긁었다 (그래서 나는 이것이 적어도 다른 사람에게 도움이되기를 희망하여 이것을 게시하고있다). 두 명의 사용자 localeCompare가 표시된 답변에 대한 주석 에서 기능을 언급 했지만 검색하는 동안 기능을 우연히 발견하기 전까지는 보지 못했습니다. String.prototype.localeCompare () 문서를 읽은 후에 나는 이것을 생각해 낼 수있었습니다.

var values = [ "Delta", "charlie", "delta", "Charlie", "Bravo", "alpha", "Alpha", "bravo" ];
var sorted = values.sort((a, b) => a.localeCompare(b, undefined, { caseFirst: "upper" }));
// Result: [ "Alpha", "alpha", "Bravo", "bravo", "Charlie", "charlie", "Delta", "delta" ]

이것은 함수가 대문자 값을 소문자 값보다 먼저 정렬하도록 지시합니다. localeCompare함수 의 두 번째 매개 변수 는 로캘을 정의하는 것입니다. 그러나 로캘을 그대로두면 undefined자동으로 로캘이 계산됩니다.

이것은 객체 배열을 정렬하는 경우에도 동일하게 작동합니다.

var values = [
    { id: 6, title: "Delta" },
    { id: 2, title: "charlie" },
    { id: 3, title: "delta" },
    { id: 1, title: "Charlie" },
    { id: 8, title: "Bravo" },
    { id: 5, title: "alpha" },
    { id: 4, title: "Alpha" },
    { id: 7, title: "bravo" }
];
var sorted = values
    .sort((a, b) => a.title.localeCompare(b.title, undefined, { caseFirst: "upper" }));

5

sort콜백 함수와 함께 JavaScript 메소드를 사용할 수 있습니다 .

function compareASC(homeA, homeB)
{
    return parseFloat(homeA.price) - parseFloat(homeB.price);
}

function compareDESC(homeA, homeB)
{
    return parseFloat(homeB.price) - parseFloat(homeA.price);
}

// Sort ASC
homes.sort(compareASC);

// Sort DESC
homes.sort(compareDESC);

4

위의 모든 답변의 정점은 다음과 같습니다.

바이올린 유효성 검사 : http://jsfiddle.net/bobberino/4qqk3/

var sortOn = function (arr, prop, reverse, numeric) {

    // Ensure there's a property
    if (!prop || !arr) {
        return arr
    }

    // Set up sort function
    var sort_by = function (field, rev, primer) {

        // Return the required a,b function
        return function (a, b) {

            // Reset a, b to the field
            a = primer(a[field]), b = primer(b[field]);

            // Do actual sorting, reverse as needed
            return ((a < b) ? -1 : ((a > b) ? 1 : 0)) * (rev ? -1 : 1);
        }

    }

    // Distinguish between numeric and string to prevent 100's from coming before smaller
    // e.g.
    // 1
    // 20
    // 3
    // 4000
    // 50

    if (numeric) {

        // Do sort "in place" with sort_by function
        arr.sort(sort_by(prop, reverse, function (a) {

            // - Force value to a string.
            // - Replace any non numeric characters.
            // - Parse as float to allow 0.02 values.
            return parseFloat(String(a).replace(/[^0-9.-]+/g, ''));

        }));
    } else {

        // Do sort "in place" with sort_by function
        arr.sort(sort_by(prop, reverse, function (a) {

            // - Force value to string.
            return String(a).toUpperCase();

        }));
    }


}

* (rev? -1 : 1)의 중요성이 무엇인지 설명해 주시겠습니까?
TechTurtle

그것은 rev 인수가 true 일 때 rev 부분을 오름차순 대 내림차순으로 뒤집는 것입니다. 그렇지 않으면 1 만 곱해도 아무것도하지 않으며 설정되면 결과에 -1을 곱하여 결과를 반전시킵니다.
bob

3

나는 또한 일종의 등급 및 여러 필드 정렬 작업을했습니다.

arr = [
    {type:'C', note:834},
    {type:'D', note:732},
    {type:'D', note:008},
    {type:'F', note:474},
    {type:'P', note:283},
    {type:'P', note:165},
    {type:'X', note:173},
    {type:'Z', note:239},
];

arr.sort(function(a,b){        
    var _a = ((a.type==='C')?'0':(a.type==='P')?'1':'2');
    _a += (a.type.localeCompare(b.type)===-1)?'0':'1';
    _a += (a.note>b.note)?'1':'0';
    var _b = ((b.type==='C')?'0':(b.type==='P')?'1':'2');
    _b += (b.type.localeCompare(a.type)===-1)?'0':'1';
    _b += (b.note>a.note)?'1':'0';
    return parseInt(_a) - parseInt(_b);
});

결과

[
    {"type":"C","note":834},
    {"type":"P","note":165},
    {"type":"P","note":283},
    {"type":"D","note":8},
    {"type":"D","note":732},
    {"type":"F","note":474},
    {"type":"X","note":173},
    {"type":"Z","note":239}
]

3

단일 배열을 정렬하는 데 약간의 과도한 노력이지만,이 프로토 타입 함수를 사용하면 구문을 사용 하여 중첩 키를 포함하여 오름차순 또는 내림차순으로 모든 키별로 Javascript 배열을 정렬 할 수 있습니다 dot.

(function(){
    var keyPaths = [];

    var saveKeyPath = function(path) {
        keyPaths.push({
            sign: (path[0] === '+' || path[0] === '-')? parseInt(path.shift()+1) : 1,
            path: path
        });
    };

    var valueOf = function(object, path) {
        var ptr = object;
        for (var i=0,l=path.length; i<l; i++) ptr = ptr[path[i]];
        return ptr;
    };

    var comparer = function(a, b) {
        for (var i = 0, l = keyPaths.length; i < l; i++) {
            aVal = valueOf(a, keyPaths[i].path);
            bVal = valueOf(b, keyPaths[i].path);
            if (aVal > bVal) return keyPaths[i].sign;
            if (aVal < bVal) return -keyPaths[i].sign;
        }
        return 0;
    };

    Array.prototype.sortBy = function() {
        keyPaths = [];
        for (var i=0,l=arguments.length; i<l; i++) {
            switch (typeof(arguments[i])) {
                case "object": saveKeyPath(arguments[i]); break;
                case "string": saveKeyPath(arguments[i].match(/[+-]|[^.]+/g)); break;
            }
        }
        return this.sort(comparer);
    };    
})();

용법:

var data = [
    { name: { first: 'Josh', last: 'Jones' }, age: 30 },
    { name: { first: 'Carlos', last: 'Jacques' }, age: 19 },
    { name: { first: 'Carlos', last: 'Dante' }, age: 23 },
    { name: { first: 'Tim', last: 'Marley' }, age: 9 },
    { name: { first: 'Courtney', last: 'Smith' }, age: 27 },
    { name: { first: 'Bob', last: 'Smith' }, age: 30 }
]

data.sortBy('age'); // "Tim Marley(9)", "Carlos Jacques(19)", "Carlos Dante(23)", "Courtney Smith(27)", "Josh Jones(30)", "Bob Smith(30)"

도트 구문 또는 배열 구문을 사용하여 중첩 된 속성을 기준으로 정렬 :

data.sortBy('name.first'); // "Bob Smith(30)", "Carlos Dante(23)", "Carlos Jacques(19)", "Courtney Smith(27)", "Josh Jones(30)", "Tim Marley(9)"
data.sortBy(['name', 'first']); // "Bob Smith(30)", "Carlos Dante(23)", "Carlos Jacques(19)", "Courtney Smith(27)", "Josh Jones(30)", "Tim Marley(9)"

여러 키를 기준으로 정렬 :

data.sortBy('name.first', 'age'); // "Bob Smith(30)", "Carlos Jacques(19)", "Carlos Dante(23)", "Courtney Smith(27)", "Josh Jones(30)", "Tim Marley(9)"
data.sortBy('name.first', '-age'); // "Bob Smith(30)", "Carlos Dante(23)", "Carlos Jacques(19)", "Courtney Smith(27)", "Josh Jones(30)", "Tim Marley(9)"

https://github.com/eneko/Array.sortBy를 통해 저장소를 포크 할 수 있습니다.


나는 sortBy간결한 구문 때문에이 답변을 많이 좋아 합니다. 중첩 된 필드에서도 사용하기 쉬우면서도 뛰어난 코드 가독성을 유지합니다. 감사합니다!
Manfred Urban

3

ECMAScript 6를 사용하면 StoBor의 답변을 훨씬 간결하게 수행 할 수 있습니다.

homes.sort((a, b) => a.price - b.price)

3

가격의 내림차순 :

homes.sort((x,y) => {return y.price - x.price})

가격 오름차순 :

homes.sort((x,y) => {return x.price - y.price})

2

배열을 정렬하려면 비교기 함수를 정의해야합니다. 이 기능은 원하는 정렬 패턴 또는 순서 (예 : 오름차순 또는 내림차순)에서 항상 다릅니다.

배열을 오름차순 또는 내림차순으로 정렬하고 객체, 문자열 또는 숫자 값을 포함하는 일부 함수를 작성하십시오.

function sorterAscending(a,b) {
    return a-b;
}

function sorterDescending(a,b) {
    return b-a;
}

function sorterPriceAsc(a,b) {
    return parseInt(a['price']) - parseInt(b['price']);
}

function sorterPriceDes(a,b) {
    return parseInt(b['price']) - parseInt(b['price']);
}

알파벳순 및 오름차순으로 숫자 정렬 :

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();

알파벳순 및 내림차순으로 숫자 정렬 :

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
fruits.reverse();

숫자 정렬 (숫자 및 오름차순) :

var points = [40,100,1,5,25,10];
points.sort(sorterAscending());

숫자 정렬 (숫자 및 내림차순) :

var points = [40,100,1,5,25,10];
points.sort(sorterDescending());

위와 같이 sorterPriceAsc 및 sorterPriceDes 메소드를 원하는 키로 배열과 함께 사용하십시오.

homes.sort(sorterPriceAsc()) or homes.sort(sorterPriceDes())

2

Underscore.js 를 사용하는 경우 sortBy를 시도하십시오.

// price is of an integer type
_.sortBy(homes, "price"); 

// price is of a string type
_.sortBy(homes, function(home) {return parseInt(home.price);}); 

2

다음은 "JavaScript : The Good Parts"책에서 약간 수정 된 고급 구현입니다.

참고 :이 버전 by안정적 입니다. 다음 체인 정렬을 수행하는 동안 첫 번째 정렬 순서를 유지합니다.

isAscending매개 변수를 추가 했습니다. 또한 ES6저자가 권장하는 표준 및 "최신"좋은 부품으로 변환했습니다 .

여러 속성으로 오름차순 및 내림차순 및 체인 정렬을 정렬 할 수 있습니다.

const by = function (name, minor, isAscending=true) {
    const reverseMutliplier = isAscending ? 1 : -1;
    return function (o, p) {
        let a, b;
        let result;
        if (o && p && typeof o === "object" && typeof p === "object") {
            a = o[name];
            b = p[name];
            if (a === b) {
                return typeof minor === 'function' ? minor(o, p) : 0;
            }
            if (typeof a === typeof b) {
                result = a < b ? -1 : 1;
            } else {
                result = typeof a < typeof b ? -1 : 1;
            }
            return result * reverseMutliplier;
        } else {
            throw {
                name: "Error",
                message: "Expected an object when sorting by " + name
            };
        }
    };
};

let s = [
    {first: 'Joe',   last: 'Besser'},
    {first: 'Moe',   last: 'Howard'},
    {first: 'Joe',   last: 'DeRita'},
    {first: 'Shemp', last: 'Howard'},
    {first: 'Larry', last: 'Fine'},
    {first: 'Curly', last: 'Howard'}
];

// Sort by: first ascending, last ascending
s.sort(by("first", by("last")));    
console.log("Sort by: first ascending, last ascending: ", s);     // "[
//     {"first":"Curly","last":"Howard"},
//     {"first":"Joe","last":"Besser"},     <======
//     {"first":"Joe","last":"DeRita"},     <======
//     {"first":"Larry","last":"Fine"},
//     {"first":"Moe","last":"Howard"},
//     {"first":"Shemp","last":"Howard"}
// ]

// Sort by: first ascending, last descending
s.sort(by("first", by("last", 0, false)));  
console.log("sort by: first ascending, last descending: ", s);    // "[
//     {"first":"Curly","last":"Howard"},
//     {"first":"Joe","last":"DeRita"},     <========
//     {"first":"Joe","last":"Besser"},     <========
//     {"first":"Larry","last":"Fine"},
//     {"first":"Moe","last":"Howard"},
//     {"first":"Shemp","last":"Howard"}
// ]


{"first":"Curly","last":"Howard", "property" : {"id" : "1"}}배열 유형을 ID별로 정렬 할 수 있습니까?
Vishal Kumar Sahu

예, 새 매개 변수 (예 : nestedName)를 사용하려면 함수를 약간 수정해야합니다. 그런 다음 byname = "property", nestedName = "id"
mythicalcoder

2

요소 값의 일반 배열에만 해당 :

function sortArrayOfElements(arrayToSort) {
    function compareElements(a, b) {
        if (a < b)
            return -1;
        if (a > b)
            return 1;
        return 0;
    }

    return arrayToSort.sort(compareElements);
}

e.g. 1:
var array1 = [1,2,545,676,64,2,24]
output : [1, 2, 2, 24, 64, 545, 676]

var array2 = ["v","a",545,676,64,2,"24"]
output: ["a", "v", 2, "24", 64, 545, 676]

객체 배열의 경우 :

function sortArrayOfObjects(arrayToSort, key) {
    function compareObjects(a, b) {
        if (a[key] < b[key])
            return -1;
        if (a[key] > b[key])
            return 1;
        return 0;
    }

    return arrayToSort.sort(compareObjects);
}

e.g. 1: var array1= [{"name": "User4", "value": 4},{"name": "User3", "value": 3},{"name": "User2", "value": 2}]

output : [{"name": "User2", "value": 2},{"name": "User3", "value": 3},{"name": "User4", "value": 4}]

2

아래 코드를 사용하여 입력을 기반으로 함수를 만들고 정렬

var homes = [{

    "h_id": "3",
    "city": "Dallas",
    "state": "TX",
    "zip": "75201",
    "price": "162500"

 }, {

    "h_id": "4",
    "city": "Bevery Hills",
    "state": "CA",
    "zip": "90210",
    "price": "319250"

 }, {

    "h_id": "5",
    "city": "New York",
    "state": "NY",
    "zip": "00010",
    "price": "962500"

 }];

 function sortList(list,order){
     if(order=="ASC"){
        return list.sort((a,b)=>{
            return parseFloat(a.price) - parseFloat(b.price);
        })
     }
     else{
        return list.sort((a,b)=>{
            return parseFloat(b.price) - parseFloat(a.price);
        });
     }
 }

 sortList(homes,'DESC');
 console.log(homes);

2

문자열 비교에 string1.localeCompare (string2)를 사용할 수 있습니다

this.myArray.sort((a,b) => { 
    return a.stringProp.localeCompare(b.stringProp);
});

참고 localCompare경우는 민감


1

여러 배열 객체 필드에서 정렬합니다. arrprop배열에 필드 이름을 입력 ["a","b","c"] 한 다음 arrsource정렬하려는 두 번째 매개 변수 실제 소스 를 전달하십시오 .

function SortArrayobject(arrprop,arrsource){
arrprop.forEach(function(i){
arrsource.sort(function(a,b){
return ((a[i] < b[i]) ? -1 : ((a[i] > b[i]) ? 1 : 0));
});
});
return arrsource;
}

1

두 가지 기능이 필요합니다

function desc(a, b) {
 return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
}

function asc(a, b) {
  return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}

그런 다음이를 모든 객체 속성에 적용 할 수 있습니다.

 data.sort((a, b) => desc(parseFloat(a.price), parseFloat(b.price)));

let data = [
    {label: "one", value:10},
    {label: "two", value:5},
    {label: "three", value:1},
];

// sort functions
function desc(a, b) {
 return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
}

function asc(a, b) {
 return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}

// DESC
data.sort((a, b) => desc(a.value, b.value));

document.body.insertAdjacentHTML(
 'beforeend', 
 '<strong>DESCending sorted</strong><pre>' + JSON.stringify(data) +'</pre>'
);

// ASC
data.sort((a, b) => asc(a.value, b.value));

document.body.insertAdjacentHTML(
 'beforeend', 
 '<strong>ASCending sorted</strong><pre>' + JSON.stringify(data) +'</pre>'
);


0

최근에 이것을 사용하려는 경우이를 관리 할 수있는 범용 함수를 작성했습니다.

/**
 * Sorts an object into an order
 *
 * @require jQuery
 *
 * @param object Our JSON object to sort
 * @param type Only alphabetical at the moment
 * @param identifier The array or object key to sort by
 * @param order Ascending or Descending
 *
 * @returns Array
 */
function sortItems(object, type, identifier, order){

    var returnedArray = [];
    var emptiesArray = []; // An array for all of our empty cans

    // Convert the given object to an array
    $.each(object, function(key, object){

        // Store all of our empty cans in their own array
        // Store all other objects in our returned array
        object[identifier] == null ? emptiesArray.push(object) : returnedArray.push(object);

    });

    // Sort the array based on the type given
    switch(type){

        case 'alphabetical':

            returnedArray.sort(function(a, b){

                return(a[identifier] == b[identifier]) ? 0 : (

                    // Sort ascending or descending based on order given
                    order == 'asc' ? a[identifier] > b[identifier] : a[identifier] < b[identifier]

                ) ? 1 : -1;

            });

            break;

        default:

    }

    // Return our sorted array along with the empties at the bottom depending on sort order
    return order == 'asc' ? returnedArray.concat(emptiesArray) : emptiesArray.concat(returnedArray);

}

0
homes.sort(function(a, b){
  var nameA=a.prices.toLowerCase(), nameB=b.prices.toLowerCase()
  if (nameA < nameB) //sort string ascending
    return -1 
  if (nameA > nameB)
    return 1
  return 0 //default return value (no sorting)
})

0

안녕하세요,이 기사를 읽은 후 하나 이상의 json 속성을 비교할 수있는 기능으로 내 요구에 맞는 sortComparator를 만들었으며 귀하와 공유하고 싶습니다.

이 솔루션은 문자열 만 오름차순으로 비교하지만 역순, 기타 데이터 유형, 로케일 사용, 캐스팅 등 각 속성에 대해 솔루션을 쉽게 확장 할 수 있습니다.

var homes = [{

    "h_id": "3",
    "city": "Dallas",
    "state": "TX",
    "zip": "75201",
    "price": "162500"

}, {

    "h_id": "4",
    "city": "Bevery Hills",
    "state": "CA",
    "zip": "90210",
    "price": "319250"

}, {

    "h_id": "5",
    "city": "New York",
    "state": "NY",
    "zip": "00010",
    "price": "962500"

}];

// comp = array of attributes to sort
// comp = ['attr1', 'attr2', 'attr3', ...]
function sortComparator(a, b, comp) {
    // Compare the values of the first attribute
    if (a[comp[0]] === b[comp[0]]) {
        // if EQ proceed with the next attributes
        if (comp.length > 1) {
            return sortComparator(a, b, comp.slice(1));
        } else {
            // if no more attributes then return EQ
            return 0;
        }
    } else {
        // return less or great
        return (a[comp[0]] < b[comp[0]] ? -1 : 1)
    }
}

// Sort array homes
homes.sort(function(a, b) {
    return sortComparator(a, b, ['state', 'city', 'zip']);
});

// display the array
homes.forEach(function(home) {
    console.log(home.h_id, home.city, home.state, home.zip, home.price);
});

결과는

$ node sort
4 Bevery Hills CA 90210 319250
5 New York NY 00010 962500
3 Dallas TX 75201 162500

그리고 다른 종류

homes.sort(function(a, b) {
    return sortComparator(a, b, ['city', 'zip']);
});

결과

$ node sort
4 Bevery Hills CA 90210 319250
3 Dallas TX 75201 162500
5 New York NY 00010 962500

0

간단한 코드 :

    var homes = [
        {
            "h_id": "3",
            "city": "Dallas",
            "state": "TX",
            "zip": "75201",
            "price": "162500"
        }, {
            "h_id": "4",
            "city": "Bevery Hills",
            "state": "CA",
            "zip": "90210",
            "price": "319250"
        }, {
            "h_id": "5",
            "city": "New York",
            "state": "NY",
            "zip": "00010",
            "price": "962500"
        }
    ];

    let sortByPrice = homes.sort(function (a, b) 
    {
      return parseFloat(b.price) - parseFloat(a.price);
    });

    for (var i=0; i<sortByPrice.length; i++)
    {
      document.write(sortByPrice[i].h_id+' '+sortByPrice[i].city+' '
       +sortByPrice[i].state+' '
       +sortByPrice[i].zip+' '+sortByPrice[i].price);
      document.write("<br>");
    }


0
 function compareValues(key, order = 'asc') {
  return function innerSort(a, b) {
    if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {
      // property doesn't exist on either object
      return 0;
    }

    const varA = (typeof a[key] === 'string')
      ? a[key].toUpperCase() : a[key];
    const varB = (typeof b[key] === 'string')
      ? b[key].toUpperCase() : b[key];

    let comparison = 0;
    if (varA > varB) {
      comparison = 1;
    } else if (varA < varB) {
      comparison = -1;
    }
    return (
      (order === 'desc') ? (comparison * -1) : comparison
    );
  };
}

http://yazilimsozluk.com/sort-array-in-javascript-by-asc-or-desc

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