JavaScript를 사용하여 이름별로 정렬 해야하는 배열 (배열의 한 객체에 대해서는 아래 참조)이 있습니다. 어떻게하니?
var user = {
bio: null,
email: "user@domain.com",
firstname: "Anna",
id: 318,
lastAvatar: null,
lastMessage: null,
lastname: "Nickson",
nickname: "anny"
};
답변
배열이 있다고 가정합니다 users
. users.sort
두 개의 인수를 사용하여 비교하는 함수를 사용 하고 전달할 수 있습니다 (비교기)
돌아와야한다
- 첫 번째 인수가 두 번째보다 작은 경우 음의 값 (결과 배열에서 두 번째 앞에 배치해야 함)
- 첫 번째 인수가 클 경우 긍정적 인 것 (두 번째 인수 뒤에 놓아야 함)
- 이 두 요소가 같으면 0입니다.
우리의 경우 두 요소가 a
있고 b
비교 a.firstname
하고 싶습니다.b.firstname
예:
users.sort(function(a, b){
if(a.firstname < b.firstname) { return -1; }
if(a.firstname > b.firstname) { return 1; }
return 0;
})
이 코드는 모든 유형에서 작동합니다.
“실제”™에서는 문자열을 비교할 때 대소 문자를 무시하고 분음 부호, ß와 같은 이상한 기호 등을 올바르게 정렬하기를 원하므로을 사용할 수 있습니다 localeCompare
. 명확성을 위해 다른 답변을 참조하십시오.
답변
ES6으로 가능한 가장 짧은 코드!
users.sort((a, b) => a.firstname.localeCompare(b.firstname))
String.prototype.localeCompare () 기본 지원은 보편적입니다!
답변
이 같은:
array.sort(function(a, b){
var nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase();
if (nameA < nameB) //sort string ascending
return -1;
if (nameA > nameB)
return 1;
return 0; //default return value (no sorting)
});
답변
비교 된 문자열에 유니 코드 문자가 포함되어 있으면 다음과 같은 클래스 localeCompare
기능 을 사용할 수 있습니다 String
.
users.sort(function(a,b){
return a.firstname.localeCompare(b.firstname);
})
답변
멋진 작은 ES6 하나의 라이너 :
users.sort((a, b) => a.firstname !== b.firstname ? a.firstname < b.firstname ? -1 : 1 : 0);
답변
localeCompare를 사용할 수 있지만 잘못된 값도 키를 확인해야합니다.
하나의 항목에 lname이 없으면 아래 코드가 작동하지 않습니다.
obj.sort((a, b) => a.lname.localeCompare(b.lname))
따라서 아래와 같이 잘못된 값을 확인해야합니다
let obj=[
{name:'john',lname:'doe',address:'Alaska'},
{name:'tom',lname:'hopes',address:'California'},
{name:'harry',address:'Texas'}
]
let field='lname';
console.log(obj.sort((a, b) => (a[field] || "").toString().localeCompare((b[field] || "").toString())));
또는
우리는 매우 간단한 lodash를 사용할 수 있습니다. 반환 된 값, 즉 숫자 또는 문자열을 감지하고 그에 따라 정렬합니다.
import sortBy from 'lodash/sortBy';
sortBy(obj,'name')
답변
underscorejs 는 매우 멋진 _.sortBy 함수를 제공합니다.
_.sortBy([{a:1},{a:3},{a:2}], "a")
또는 사용자 정의 정렬 기능을 사용할 수 있습니다.
_.sortBy([{a:"b"},{a:"c"},{a:"a"}], function(i) {return i.a.toLowerCase()})