IT

JavaScript에서 이름(알파벳 순으로 배열 정렬)

itgroup 2023. 1. 21. 09:44
반응형

JavaScript에서 이름(알파벳 순으로 배열 정렬)

JavaScript를 사용하여 이름별로 정렬해야 하는 배열(배열 내의 하나의 개체에 대해서는 아래 참조)이 있습니다.어떻게 해야 하죠?

var user = {
   bio: null,
   email:  "user@domain.example",
   firstname: "Anna",
   id: 318,
   lastAvatar: null,
   lastMessage: null,
   lastname: "Nickson",
   nickname: "anny"
};

ES6로 가능한 최단 코드!

users.sort((a, b) => a.firstname.localeCompare(b.firstname))

String.protype.locale Compare() 기본 지원은 유니버설입니다!

어레이가 있다고 가정합니다.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;
})

이 코드는 어떤 타입에서도 사용할 수 있습니다.

"real life"™에서는 문자열을 비교할 때 대소문자를 무시하고, 발음을 올바르게 정렬하고, ,과 같은 이상한 기호를 사용하고 싶어하므로, 사용하기를 원할 수 있습니다.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)
});

비교된 문자열에 Unicode 문자가 포함되어 있는 경우 다음 함수를 사용할 수 있습니다.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);

local Compare를 사용할 수 있지만 falsey 값이 없는지 키도 확인해야 합니다.

다음 코드는 하나의 엔트리에 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()})

이름을 정렬하거나 charact 또는 special ((스페인어에서는 보통)와 같은 특수문자를 사용하는 경우 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)

official local 옵션은 여기서 es(스페인어), de(독일어), fr(프랑스어)로 확인할 수 있습니다.감도 기준 평균에 대하여:

기본 문자가 다른 문자열만 동등하지 않은 것으로 비교됩니다.예: a µ b, a = ah, a = A.

보다 간결한 표기법:

user.sort(function(a, b){
    return a.firstname === b.firstname ? 0 : a.firstname < b.firstname ? -1 : 1;
})

아무도 콜레이터에 대해 언급하지 않았다니 놀랍군요. 하면 안 요.localeCompare가 하게 저하되어 있기 에, 할가 없는 한.

const collator = new Intl.Collator('zh-CN'); // Chinese Simplified for example

function sortAsc(a, b) {
  if (typeof a === 'string' && typeof b === 'string') {
    return collator.compare(b, a)
  }

  return b - a;
}

function sortDesc(a, b) {
  if (typeof a === 'string' && typeof b === 'string') {
    return collator.compare(a, b);
  }

  return a - b;
}

기본적으로 배열은 방식 정렬로 정렬할 수 있지만 객체를 정렬하려면 배열 정렬 방식으로 함수를 전달해야 합니다. 따라서 어레이를 사용하는 예를 제시하겠습니다.

user = [
  {
    bio: "<null>",
    email: "user@domain.example",
    firstname: "Anna",
    id: 318,
    last_avatar: "<null>",
    last_message: "<null>",
    lastname: "Nickson",
    nickname: "anny",
  },
  {
    bio: "<null>",
    email: "user@domain.example",
    firstname: "Senad",
    id: 318,
    last_avatar: "<null>",
    last_message: "<null>",
    lastname: "Nickson",
    nickname: "anny",
  },
  {
    bio: "<null>",
    email: "user@domain.example",
    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)*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) );

이 답변에서 영감을 얻어

users.sort((a,b) => (a.firstname  - b.firstname));

또한 asec 및 desc sort 모두에 대해 다음을 사용할 수 있습니다.필요한 오름차순 정렬 또는 내림차순 정렬을 지정하는 변수 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. 마지막 파라미터는 부울타입입니다.오름차순으로 정렬할지 내림차순으로 정렬할지 확인합니다.

간단히 말하면 이 방법을 사용할 수 있다

users.sort(function(a,b){return a.firstname < b.firstname ? -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);}

레코드에 대해서만 이름 있는 정렬 함수를 사용하는 경우 구문은 다음과 같습니다.

let sortFunction = (a, b) => {
 if(a.firstname < b.firstname) { return -1; }
 if(a.firstname > b.firstname) { return 1; }
 return 0;
})
users.sort(sortFunction)

다음 기능은 작동하지 않습니다.

users.sort(sortFunction(a,b))

톱 답안을 키별로 정렬하기 위해 프로토타입에 밀어넣었다.

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

인 '내부 배열 방식'을 사용할 수 .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()대소문자의 차이가 정렬 프로세스의 정확성에 영향을 주지 않도록 커스텀 정렬 콜백 방식에서 사용합니다.

나는 이 설명이 충분히 명확하기를 바란다.만약 당신이 더 많은 정보가 필요하다고 생각한다면 자유롭게 코멘트를 해 주세요.

건배!

두 요인 정렬(이름과 성)의 경우:

users.sort((a, b) => a.name.toLowerCase() < b.name.toLowerCase() ? -1 : a.name.toLowerCase() > b.name.toLowerCase() ? 1 : a.lastname.toLowerCase() < b.lastname.toLowerCase() ? -1 : a.lastname.toLowerCase() > b.lastname.toLowerCase() ? 1 : 0)

대소문자를 구분하기 위해 비슷한 것을 사용할 수 있습니다.

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;

})

구현은 이전 ES 버전에서 잘 작동합니다.

sortObject = function(data) {
    var keys = Object.keys(data);
    var result = {};

    keys.sort();

    for(var i = 0; i < keys.length; i++) {
        var key = keys[i];

        result[key] = data[key];
    }

    return result;
};

언급URL : https://stackoverflow.com/questions/6712034/sort-array-by-firstname-alphabetically-in-javascript

반응형