Javascript에서 이름을 알파벳순으로 배열 정렬
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
. 명확성을 위해 다른 답변을 참조하십시오.
이 같은:
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.localeCompare(b.firstname))
String.prototype.localeCompare () 기본 지원은 보편적입니다!
멋진 작은 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')
https://lodash.com/docs/4.17.5#sortBy
underscorejs 는 매우 멋진 _.sortBy 함수를 제공합니다.
_.sortBy([{a:1},{a:3},{a:2}], "a")
또는 사용자 정의 정렬 기능을 사용할 수 있습니다.
_.sortBy([{a:"b"},{a:"c"},{a:"a"}], function(i) {return i.a.toLowerCase()})
ñ 또는 áéíóú (스페인어 공용어) 와 같은 특수 문자로 이름이나 무언가를 정렬 하는 경우 params locales ( 이 경우 스페인어 es ) 및 다음과 같은 옵션을 사용할 수 있습니다 .
let user = [{'firstname': 'Az'},{'firstname': 'Áb'},{'firstname':'ay'},{'firstname': 'Ña'},{'firstname': 'Nz'},{'firstname': 'ny'}];
user.sort((a, b) => a.firstname.localeCompare(b.firstname, 'es', {sensitivity: 'base'}))
console.log(user)
oficial 로케일 옵션은 iana , es (스페인어), de (독일어), fr (프랑스어) 에서 찾을 수 있습니다 . 약 감도 기본 수단 :
기본 문자가 다른 문자열 만 다른 것으로 비교합니다. 예 : a ≠ b, a = á, a = A
기본적으로 메소드 정렬을 사용하여 배열을 정렬 할 수 있지만 객체를 정렬하려면 배열의 메소드를 정렬하는 함수를 전달해야하므로 배열을 사용하여 예제를 제공합니다.
user = [{
bio: "<null>",
email: "user@domain.com",
firstname: 'Anna',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: 'Nickson',
nickname: 'anny'
},
{
bio: "<null>",
email: "user@domain.com",
firstname: 'Senad',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: 'Nickson',
nickname: 'anny'
},
{
bio: "<null>",
email: "user@domain.com",
firstname: 'Muhamed',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: 'Nickson',
nickname: 'anny'
}];
var ar = user.sort(function(a, b)
{
var nA = a.firstname.toLowerCase();
var nB = b.firstname.toLowerCase();
if(nA < nB)
return -1;
else if(nA > nB)
return 1;
return 0;
});
이 답변 에서 영감을 얻은
users.sort((a,b) => (a.firstname - b.firstname));
더 간결한 표기법 :
user.sort(function(a, b){
return a.firstname === b.firstname ? 0 : a.firstname < b.firstname ? -1 : 1;
})
또한 asec 및 desc 정렬 모두에 대해 다음을 사용할 수 있습니다. 원하는 오름차순 정렬 또는 내림차순 정렬을 지정 하는 변수 SortType 이 있다고 가정하십시오 .
users.sort(function(a,b){
return sortType==="asc"? a.firstName.localeCompare( b.firstName): -( a.firstName.localeCompare( b.firstName));
})
다음과 같이 일반화 된 함수를 작성할 수 있습니다
function getSortedData(data, prop, isAsc) {
return data.sort((a, b) => (a[prop] < b[prop] ? -1 : 1) * (isAsc ? 1 : -1));
}
아래 매개 변수를 전달할 수 있습니다
- 정렬하려는 데이터
- 데이터별로 속성을 정렬해야합니다.
- 마지막 매개 변수는 부울 유형입니다. 오름차순 또는 내림차순으로 정렬할지 확인합니다.
이것을 객체에 사용할 수 있습니다
transform(array: any[], field: string): any[] {
return array.sort((a, b) => a[field].toLowerCase() !== b[field].toLowerCase() ? a[field].toLowerCase() < b[field].toLowerCase() ? -1 : 1 : 0);}
시험
users.sort((a,b)=> (a.firstname>b.firstname)*2-1)
var users = [
{ firstname: "Kate", id: 318, /*...*/ },
{ firstname: "Anna", id: 319, /*...*/ },
{ firstname: "Cristine", id: 317, /*...*/ },
]
console.log(users.sort((a,b)=> (a.firstname>b.firstname)*2-1) );
내장 배열 방법-을 사용할 수 있습니다 sort
. 이 메소드는 콜백 메소드를 매개 변수로 사용합니다.
// custom sort function to be passed as param/callback to the Array's sort method
function myCustomSort(a, b) {
return (a.toLowerCase() > b.toLowerCase()) ? 1 : -1;
}
// Actual method to be called by entity that needs sorting feature
function sortStrings() {
var op = Array.prototype.sort.call(arguments, myCustomSort);
}
// Testing the implementation
var sortedArray = sortStrings("Burger", "Mayo1", "Pizza", "boxes", "Apples", "Mayo");
console.log(sortedArray); //["Apples", "boxes", "Burger", "Mayo", "Mayo1", "Pizza"]
이 코드를 이해하기 위해 주목할 사항.
- 이 경우 사용자 지정 방법
myCustomSort
은 각 요소 쌍 (입력 배열에서) 비교에 대해 +1 또는 -1을 반환해야합니다. - 대소 문자 구분이 정렬 프로세스의 정확성에 영향을 미치지 않도록 사용자 정의 정렬 콜백 메소드에서
toLowerCase()
/toUpperCase()
를 사용하십시오 .
나는 이것이 충분히 설명되기를 바랍니다. 더 많은 정보가 필요하다고 생각되면 언제든지 의견을 말하십시오.
건배!
주요 답변을 프로토 타입으로 푸시하여 키별로 정렬했습니다.
Array.prototype.alphaSortByKey= function (key) {
this.sort(function (a, b) {
if (a[key] < b[key])
return -1;
if (a[key] > b[key])
return 1;
return 0;
});
return this;
};
간단히 말해서이 방법을 사용할 수 있습니다
users.sort(function(a,b){return a.firstname < b.firstname ? -1 : 1});
대소 문자를 구분 하기 위해 비슷한 것을 사용할 수 있습니다
users.sort(function(a, b){
//compare two values
if(a.firstname.toLowerCase() < b.firstname.toLowerCase()) return -1;
if(a.firstname.toLowerCase() > b.firstname.toLowerCase()) return 1;
return 0;
})
참고 URL : https://stackoverflow.com/questions/6712034/sort-array-by-firstname-alphabetically-in-javascript
'Programing' 카테고리의 다른 글
안드로이드 : 버튼 또는 이미지 버튼에 텍스트 및 이미지 결합 (0) | 2020.02.11 |
---|---|
내 Android 애플리케이션에서 직접 Google Play 스토어를 여는 방법은 무엇입니까? (0) | 2020.02.11 |
Cosmic Rays : 프로그램에 영향을 미칠 확률은 얼마입니까? (0) | 2020.02.11 |
링크 vs 컴파일 vs 컨트롤러 (0) | 2020.02.11 |
Django의“슬러그”란 무엇입니까? (0) | 2020.02.11 |