Programing

Javascript에서 이름을 알파벳순으로 배열 정렬

lottogame 2020. 2. 11. 22:16
반응형

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));
   }

아래 매개 변수를 전달할 수 있습니다

  1. 정렬하려는 데이터
  2. 데이터별로 속성을 정렬해야합니다.
  3. 마지막 매개 변수는 부울 유형입니다. 오름차순 또는 내림차순으로 정렬할지 확인합니다.

이것을 객체에 사용할 수 있습니다

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"]


이 코드를 이해하기 위해 주목할 사항.

  1. 이 경우 사용자 지정 방법 myCustomSort은 각 요소 쌍 (입력 배열에서) 비교에 대해 +1 또는 -1을 반환해야합니다.
  2. 대소 문자 구분이 정렬 프로세스의 정확성에 영향을 미치지 않도록 사용자 정의 정렬 콜백 메소드에서 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



반응형