어레이의 한 속성에 대해 어레이 내의 개체를 알파벳 순으로 정렬합니다.
예를 들어 다음과 같은 JavaScript 클래스가 있다고 가정해 보겠습니다.
var DepartmentFactory = function(data) {
this.id = data.Id;
this.name = data.DepartmentName;
this.active = data.Active;
}
그런 다음 해당 클래스의 인스턴스를 여러 개 만들어 배열에 저장한다고 가정합니다.
var objArray = [];
objArray.push(DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true}));
objArray.push(DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true}));
objArray.push(DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true}));
objArray.push(DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true}));
그래서 저는 이제 일련의 오브젝트를 만들 것입니다.DepartmentFactory
. 어떻게 하면 사용할 수 있을까요?array.sort()
이 오브젝트 배열을 정렬하는 방법DepartmentName
각 객체의 특성
그array.sort()
문자열 배열을 정렬할 때 메서드가 제대로 작동합니다.
var myarray=["Bob", "Bully", "Amy"];
myarray.sort(); //Array now becomes ["Amy", "Bob", "Bully"]
하지만 어떻게 하면 오브젝트 목록을 사용할 수 있을까요?
다음과 같은 작업을 수행해야 합니다.
objArray.sort(function(a, b) {
var textA = a.DepartmentName.toUpperCase();
var textB = b.DepartmentName.toUpperCase();
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});
주의: 대소문자를 대문자와 소문자로 변경함으로써 대소문자를 구분하지 않습니다.
Unicode를 지원하려면:
objArray.sort(function(a, b) {
return a.DepartmentName.localeCompare(b.DepartmentName);
});
ES6를 사용한 짧은 코드 단축
objArray.sort((a, b) => a.DepartmentName.toLowerCase().localeCompare(b.DepartmentName.toLowerCase()))
objArray.sort((a, b) => a.DepartmentName.localeCompare(b.DepartmentName))
var DepartmentFactory = function(data) {
this.id = data.Id;
this.name = data.DepartmentName;
this.active = data.Active;
}
// use `new DepartmentFactory` as given below. `new` is imporatant
var objArray = [];
objArray.push(new DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true}));
objArray.push(new DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true}));
objArray.push(new DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true}));
objArray.push(new DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true}));
function sortOn(property){
return function(a, b){
if(a[property] < b[property]){
return -1;
}else if(a[property] > b[property]){
return 1;
}else{
return 0;
}
}
}
//objArray.sort(sortOn("id")); // because `this.id = data.Id;`
objArray.sort(sortOn("name")); // because `this.name = data.DepartmentName;`
console.log(objArray);
데모: http://jsfiddle.net/diode/hdgeH/
// Sorts an array of objects "in place". (Meaning that the original array will be modified and nothing gets returned.)
function sortOn (arr, prop) {
arr.sort (
function (a, b) {
if (a[prop] < b[prop]){
return -1;
} else if (a[prop] > b[prop]){
return 1;
} else {
return 0;
}
}
);
}
//Usage example:
var cars = [
{make:"AMC", model:"Pacer", year:1978},
{make:"Koenigsegg", model:"CCGT", year:2011},
{make:"Pagani", model:"Zonda", year:2006},
];
// ------- make -------
sortOn(cars, "make");
console.log(cars);
/* OUTPUT:
AMC : Pacer : 1978
Koenigsegg : CCGT : 2011
Pagani : Zonda : 2006
*/
// ------- model -------
sortOn(cars, "model");
console.log(cars);
/* OUTPUT:
Koenigsegg : CCGT : 2011
AMC : Pacer : 1978
Pagani : Zonda : 2006
*/
// ------- year -------
sortOn(cars, "year");
console.log(cars);
/* OUTPUT:
AMC : Pacer : 1978
Pagani : Zonda : 2006
Koenigsegg : CCGT : 2011
*/
objArray.sort( (a, b) => a.id.localeCompare(b.id, 'en', {'sensitivity': 'base'}));
알파벳 순으로 정렬되며 대소문자를 구분하지 않습니다.또한 매우 깔끔하고 읽기 쉽습니다.d
데모
var DepartmentFactory = function(data) {
this.id = data.Id;
this.name = data.DepartmentName;
this.active = data.Active;
}
var objArray = [];
objArray.push(new DepartmentFactory({Id: 1, DepartmentName: 'Marketing', Active: true}));
objArray.push(new DepartmentFactory({Id: 2, DepartmentName: 'Sales', Active: true}));
objArray.push(new DepartmentFactory({Id: 3, DepartmentName: 'Development', Active: true}));
objArray.push(new DepartmentFactory({Id: 4, DepartmentName: 'Accounting', Active: true}));
console.log(objArray.sort(function(a, b) { return a.name > b.name}));
그것은 이렇게 하세요.
objArrayy.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)
});
console.log(objArray)
여기의 솔루션은 모두 null/정의되지 않은 세이프 오퍼레이션 없이 제시되었기 때문에 다음과 같이 처리합니다(null은 필요에 따라 처리할 수 있습니다).
ES5
objArray.sort(
function(a, b) {
var departmentNameA = a.DepartmentName ? a.DepartmentName : '';
var departmentNameB = b.DepartmentName ? b.DepartmentName : '';
departmentNameA.localeCompare(departmentNameB);
}
);
ES6+
objArray.sort(
(a: DepartmentFactory, b: DepartmentFactory): number => {
const departmentNameA = a.DepartmentName ? a.DepartmentName : '';
const departmentNameB = b.DepartmentName ? b.DepartmentName : '';
departmentNameA.localeCompare(departmentNameB);
}
);
localCompare는 대소문자를 구분하지 않기 때문에 다른 사용자가 사용한 toLowerCase도 삭제했습니다.또한 Typescript 또는 ES6+를 사용할 때는 향후 개발자에게 보다 명확한 파라미터를 제공할 수 있도록 조금 더 명확한 파라미터를 선호합니다.
다음은 속성을 통해 개체 배열을 정렬하는 데 사용할 수 있는 간단한 함수입니다. 속성이 문자열의 유형이든 정수이든 상관 없습니다.
var cars = [
{make:"AMC", model:"Pacer", year:1978},
{make:"Koenigsegg", model:"CCGT", year:2011},
{make:"Pagani", model:"Zonda", year:2006},
];
function sortObjectsByProp(objectsArr, prop, ascending = true) {
let objectsHaveProp = objectsArr.every(object => object.hasOwnProperty(prop));
if(objectsHaveProp) {
let newObjectsArr = objectsArr.slice();
newObjectsArr.sort((a, b) => {
if(isNaN(Number(a[prop]))) {
let textA = a[prop].toUpperCase(),
textB = b[prop].toUpperCase();
if(ascending) {
return textA < textB ? -1 : textA > textB ? 1 : 0;
} else {
return textB < textA ? -1 : textB > textA ? 1 : 0;
}
} else {
return ascending ? a[prop] - b[prop] : b[prop] - a[prop];
}
});
return newObjectsArr;
}
return objectsArr;
}
let sortedByMake = sortObjectsByProp(cars, "make"); // returns ascending order by its make;
let sortedByYear = sortObjectsByProp(cars, "year", false); // returns descending order by its year,since we put false as a third argument;
console.log(sortedByMake);
console.log(sortedByYear);
이것을 조금 시도하고, 가능한 한 루프를 줄이려고 노력한 결과, 다음과 같은 해결책을 얻을 수 있었습니다.
const items = [
{
name: 'One'
},
{
name: 'Maria is here'
},
{
name: 'Another'
},
{
name: 'Z with a z'
},
{
name: '1 number'
},
{
name: 'Two not a number'
},
{
name: 'Third'
},
{
name: 'Giant'
}
];
const sorted = items.sort((a, b) => {
return a[name] > b[name];
});
let sortedAlphabetically = {};
for(var item in sorted) {
const firstLetter = sorted[item].name[0];
if(sortedAlphabetically[firstLetter]) {
sortedAlphabetically[firstLetter].push(sorted[item]);
} else {
sortedAlphabetically[firstLetter] = [sorted[item]];
}
}
console.log('sorted', sortedAlphabetically);
두 개의 파라미터를 받아들여 비교하고 숫자를 반환하는 함수를 통과해야 합니다.따라서 ID로 정렬하고 싶다고 가정하면 다음과 같이 쓸 수 있습니다.
objArray.sort(function(a,b) {
return a.id-b.id;
});
// objArray is now sorted by Id
간단한 답변:
objArray.sort(function(obj1, obj2) {
return obj1.DepartmentName > obj2.DepartmentName;
});
ES6 방식:
objArray.sort((obj1, obj2) => {return obj1.DepartmentName > obj2.DepartmentName};
소문자/대문자 등으로 입력해야 하는 경우, 해당 변수를 비교하지 말고 해당 결과를 변수에 저장하십시오.예:
objArray.sort((obj1, obj2) => {
var firstObj = obj1.toLowerCase();
var secondObj = obj2.toLowerCase();
return firstObj.DepartmentName > secondObj.DepartmentName;
});
언급URL : https://stackoverflow.com/questions/8900732/sort-objects-in-an-array-alphabetically-on-one-property-of-the-array
'itsource' 카테고리의 다른 글
스칼라 변환 방법java.util.List에 목록 표시? (0) | 2022.09.11 |
---|---|
형제 결과에서 매개 변수에 대한 행 값을 일치시키는 방법은 무엇입니까? (0) | 2022.09.11 |
스프링 부트 시 "기본 보안 비밀번호 사용" 삭제 (0) | 2022.09.11 |
MariaDB(mysql-config-editor에 상당)의 어디에 패스워드/로그인 패스를 저장합니까? (0) | 2022.09.11 |
문자열이 지정된 문자열로 시작되는지 확인하려면 어떻게 해야 합니다. (0) | 2022.09.11 |