JavaScript 객체 배열이 있습니다.
var objs = [
{ first_nom: 'Lazslo', last_nom: 'Jamf' },
{ first_nom: 'Pig', last_nom: 'Bodine' },
{ first_nom: 'Pirate', last_nom: 'Prentice' }
];
last_nom
JavaScript 에서 값을 기준 으로 정렬하려면 어떻게 합니까?
나는 알고 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)
});
답변
작고 멋진 밑줄을 사용하십시오 …
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"}]
업데이트 : 더 이상 원래 배열을 수정하지 않습니다.