[javascript] 문자열 속성 값으로 객체 배열 정렬

JavaScript 객체 배열이 있습니다.

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

last_nomJavaScript 에서 값을 기준 으로 정렬하려면 어떻게 합니까?

나는 알고 sort(a,b)있지만 문자열과 숫자에서만 작동하는 것 같습니다. toString()객체에 메소드 를 추가해야 합니까?



답변

자체 비교 함수를 작성하는 것은 쉽습니다.

function compare( a, b ) {
  if ( a.last_nom < b.last_nom ){
    return -1;
  }
  if ( a.last_nom > b.last_nom ){
    return 1;
  }
  return 0;
}

objs.sort( compare );

또는 인라인 (c / o Marco Demaio) :

objs.sort((a,b) => (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0)); 


답변

전달한 값을 기준으로 객체를 정렬하는 동적 정렬 함수를 만들 수도 있습니다.

function dynamicSort(property) {
    var sortOrder = 1;
    if(property[0] === "-") {
        sortOrder = -1;
        property = property.substr(1);
    }
    return function (a,b) {
        /* next line works with strings and numbers,
         * and you may want to customize it to your needs
         */
        var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
        return result * sortOrder;
    }
}

따라서 다음과 같은 객체 배열을 가질 수 있습니다.

var People = [
    {Name: "Name", Surname: "Surname"},
    {Name:"AAA", Surname:"ZZZ"},
    {Name: "Name", Surname: "AAA"}
];

… 그리고 당신이 할 때 작동합니다 :

People.sort(dynamicSort("Name"));
People.sort(dynamicSort("Surname"));
People.sort(dynamicSort("-Surname"));

실제로 이것은 이미 질문에 대답합니다. 아래 부분은 많은 사람들이 저에게 연락 하여 여러 매개 변수로 작동하지 않는다고 불평했기 때문에 작성되었습니다 .

여러 매개 변수

아래 함수를 사용하여 여러 정렬 매개 변수가있는 정렬 함수를 생성 할 수 있습니다.

function dynamicSortMultiple() {
    /*
     * save the arguments object as it will be overwritten
     * note that arguments object is an array-like object
     * consisting of the names of the properties to sort by
     */
    var props = arguments;
    return function (obj1, obj2) {
        var i = 0, result = 0, numberOfProperties = props.length;
        /* try getting a different result from 0 (equal)
         * as long as we have extra properties to compare
         */
        while(result === 0 && i < numberOfProperties) {
            result = dynamicSort(props[i])(obj1, obj2);
            i++;
        }
        return result;
    }
}

다음과 같이 할 수 있습니다.

People.sort(dynamicSortMultiple("Name", "-Surname"));

서브 클래 싱 배열

기본 객체를 확장 할 수있는 ES6을 사용할 수있는 사용자에게는 운이 좋을 것입니다.

class MyArray extends Array {
    sortBy(...args) {
        return this.sort(dynamicSortMultiple.apply(null, args));
    }
}

그것은 이것을 가능하게 할 것입니다 :

MyArray.from(People).sortBy("Name", "-Surname");


답변

ES6 / ES2015 이상에서 다음과 같이 할 수 있습니다.

objs.sort((a, b) => a.last_nom.localeCompare(b.last_nom));

ES6 / ES2015 이전

objs.sort(function(a, b) {
    return a.last_nom.localeCompare(b.last_nom)
});


답변

underscore.js

작고 멋진 밑줄을 사용하십시오 …

sortBy_.sortBy (list, iterator, [context]) 반복자를 통해 각 값을 실행 한 결과에 따라 오름차순으로 정렬 된 목록의 정렬 된 사본을 리턴합니다. 반복자는 정렬 할 속성의 문자열 이름 일 수도 있습니다 (예 : 길이).

var objs = [
  { first_nom: 'Lazslo',last_nom: 'Jamf' },
  { first_nom: 'Pig', last_nom: 'Bodine'  },
  { first_nom: 'Pirate', last_nom: 'Prentice' }
];

var sortedObjs = _.sortBy( objs, 'first_nom' );


답변

사람들이 왜 그렇게 복잡하게 만들지 마십시오.

objs.sort(function(a, b){
  return a.last_nom > b.last_nom;
});

보다 엄격한 엔진의 경우 :

objs.sort(function(a, b){
  return a.last_nom == b.last_nom ? 0 : +(a.last_nom > b.last_nom) || -1;
});

알파벳 역순으로 정렬되도록 연산자를 교체하십시오.


답변

성이 중복되는 경우 이름별로 정렬 할 수 있습니다.

obj.sort(function(a,b){
  if(a.last_nom< b.last_nom) return -1;
  if(a.last_nom >b.last_nom) return 1;
  if(a.first_nom< b.first_nom) return -1;
  if(a.first_nom >b.first_nom) return 1;
  return 0;
});


답변

프로토 타입 상속을 사용하여이 문제에 대한 간단하고 빠른 솔루션 :

Array.prototype.sortBy = function(p) {
  return this.slice(0).sort(function(a,b) {
    return (a[p] > b[p]) ? 1 : (a[p] < b[p]) ? -1 : 0;
  });
}

예 / 사용법

objs = [{age:44,name:'vinay'},{age:24,name:'deepak'},{age:74,name:'suresh'}];

objs.sortBy('age');
// Returns
// [{"age":24,"name":"deepak"},{"age":44,"name":"vinay"},{"age":74,"name":"suresh"}]

objs.sortBy('name');
// Returns
// [{"age":24,"name":"deepak"},{"age":74,"name":"suresh"},{"age":44,"name":"vinay"}]

업데이트 : 더 이상 원래 배열을 수정하지 않습니다.