두 필드로 Javascript 정렬 배열
grouperArray.sort(function (a, b) {
var aSize = a.gsize;
var bSize = b.gsize;
var aLow = a.glow;
var bLow = b.glow;
console.log(aLow + " | " + bLow);
return (aSize < bSize) ? -1 : (aSize > bSize) ? 1 : 0;
});
따라서 위의 코드는 가장 작은 것부터 가장 큰 것까지 gsize별로 배열을 정렬합니다. 잘 작동합니다. 그러나 gsize가 같으면 글로우별로 정렬하고 싶습니다.
감사.
grouperArray.sort(function (a, b) {
var aSize = a.gsize;
var bSize = b.gsize;
var aLow = a.glow;
var bLow = b.glow;
console.log(aLow + " | " + bLow);
if(aSize == bSize)
{
return (aLow < bLow) ? -1 : (aLow > bLow) ? 1 : 0;
}
else
{
return (aSize < bSize) ? -1 : 1;
}
});
grouperArray.sort(function (a, b) {
return a.gsize - b.gsize || a.glow - b.glow;
});
짧은 버전
grouperArray.sort((a, b) => a.gsize - b.gsize || a.glow - b.glow);
화살표 구문을 사용하는 더 짧은 버전!
나는 이것이 얼마 전에 요청되었다는 것을 알고 있지만 내 솔루션을 추가 할 것이라고 생각했습니다.
이 함수는 정렬 방법을 동적으로 생성합니다. 오름차순 또는 내림차순을 나타 내기 위해 +/-가 추가 된 정렬 가능한 각 하위 속성 이름을 제공하기 만하면됩니다. 재사용이 가능하며 함께 만든 데이터 구조에 대해 아무것도 알 필요가 없습니다. 멍청한 증거로 만들 수 있지만 필요하지 않은 것 같습니다.
function getSortMethod(){
var _args = Array.prototype.slice.call(arguments);
return function(a, b){
for(var x in _args){
var ax = a[_args[x].substring(1)];
var bx = b[_args[x].substring(1)];
var cx;
ax = typeof ax == "string" ? ax.toLowerCase() : ax / 1;
bx = typeof bx == "string" ? bx.toLowerCase() : bx / 1;
if(_args[x].substring(0,1) == "-"){cx = ax; ax = bx; bx = cx;}
if(ax != bx){return ax < bx ? -1 : 1;}
}
}
}
사용 예 :
items.sort (getSortMethod ( '-price', '+ priority', '+ name'));
이것은 items가장 낮은 price항목부터 정렬 하고 가장 높은 항목에 연결됩니다 priority. 추가 관계는 항목에 의해 끊어집니다name
항목은 다음과 같은 배열입니다.
var items = [
{ name: "z - test item", price: "99.99", priority: 0, reviews: 309, rating: 2 },
{ name: "z - test item", price: "1.99", priority: 0, reviews: 11, rating: 0.5 },
{ name: "y - test item", price: "99.99", priority: 1, reviews: 99, rating: 1 },
{ name: "y - test item", price: "0", priority: 1, reviews: 394, rating: 3.5 },
{ name: "x - test item", price: "0", priority: 2, reviews: 249, rating: 0.5 } ...
];
라이브 데모 : http://gregtaff.com/misc/multi_field_sort/
수정 : Chrome 문제가 수정되었습니다.
삼항 연산자 ((aSize < bSize) ? -1 : (aSize > bSize) ? 1 : 0;)가 당신을 혼란스럽게 할 것으로 예상합니다 . 더 잘 이해하려면 링크를 확인해야합니다.
그때까지 완전한 if / else 코드는 다음과 같습니다.
grouperArray.sort(function (a, b) {
if (a.gsize < b.gsize)
{
return -1;
}
else if (a.gsize > b.gsize)
{
return 1;
}
else
{
if (a.glow < b.glow)
{
return -1;
}
else if (a.glow > b.glow)
{
return 1;
}
return 0;
}
});
다음은 여러 필드에서 작동하는보다 일반적인 것을 원하는 사람들을위한 구현입니다.
Array.prototype.sortBy = function (propertyName, sortDirection) {
var sortArguments = arguments;
this.sort(function (objA, objB) {
var result = 0;
for (var argIndex = 0; argIndex < sortArguments.length && result === 0; argIndex += 2) {
var propertyName = sortArguments[argIndex];
result = (objA[propertyName] < objB[propertyName]) ? -1 : (objA[propertyName] > objB[propertyName]) ? 1 : 0;
//Reverse if sort order is false (DESC)
result *= !sortArguments[argIndex + 1] ? 1 : -1;
}
return result;
});
}
기본적으로 속성 이름 / 정렬 방향을 얼마든지 지정할 수 있습니다.
var arr = [{
LastName: "Doe",
FirstName: "John",
Age: 28
}, {
LastName: "Doe",
FirstName: "Jane",
Age: 28
}, {
LastName: "Foo",
FirstName: "John",
Age: 30
}];
arr.sortBy("LastName", true, "FirstName", true, "Age", false);
//Will return Jane Doe / John Doe / John Foo
arr.sortBy("Age", false, "LastName", true, "FirstName", false);
//Will return John Foo / John Doe / Jane Doe
grouperArray.sort(function (a, b) {
var aSize = a.gsize;
var bSize = b.gsize;
var aLow = a.glow;
var bLow = b.glow;
console.log(aLow + " | " + bLow);
return (aSize < bSize) ? -1 : (aSize > bSize) ? 1 : ( (aLow < bLow ) ? -1 : (aLow > bLow ) ? 1 : 0 );
});
grouperArray.sort(function (a, b) {
var aSize = a.gsize;
var bSize = b.gsize;
var aLow = a.glow;
var bLow = b.glow;
console.log(aLow + " | " + bLow);
return (aSize < bSize) ? -1 : (aSize > bSize) ? 1 : (aLow < bLow) ? -1 : (aLow > bLow) ? 1 : 0); });
다음은 재귀를 사용하여 1부터 무한까지 임의의 수의 정렬 필드를 기준으로 정렬하는 구현입니다. 정렬 할 결과 개체의 배열 인 결과 배열과 정렬을 정의하는 정렬 개체의 배열 인 정렬 배열을 전달합니다. 각 정렬 개체에는 정렬 기준이되는 키 이름에 대한 "선택"키와 "오름차순"또는 "내림차순"을 나타내는 문자열 인 "순서"키가 있어야합니다.
sortMultiCompare = (a, b, sorts) => {
let select = sorts[0].select
let order = sorts[0].order
if (a[select] < b[select]) {
return order == 'ascending' ? -1 : 1
}
if (a[select] > b[select]) {
return order == 'ascending' ? 1 : -1
}
if(sorts.length > 1) {
let remainingSorts = sorts.slice(1)
return this.sortMultiCompare(a, b, remainingSorts)
}
return 0
}
sortResults = (results, sorts) => {
return results.sort((a, b) => {
return this.sortMultiCompare(a, b, sorts)
})
}
// example inputs
const results = [
{
"LastName": "Doe",
"FirstName": "John",
"MiddleName": "Bill"
},
{
"LastName": "Doe",
"FirstName": "Jane",
"MiddleName": "Bill"
},
{
"LastName": "Johnson",
"FirstName": "Kevin",
"MiddleName": "Bill"
}
]
const sorts = [
{
"select": "LastName",
"order": "ascending"
},
{
"select": "FirstName",
"order": "ascending"
},
{
"select": "MiddleName",
"order": "ascending"
}
]
// call the function like this:
let sortedResults = sortResults(results, sorts)
grouperArray.sort(
function(a,b){return a.gsize == b.gsize ? a.glow - b.glow : a.gsize - b.gsize}
);
grouperArray.sort(function (a, b) {
var aSize = a.gsize;
var bSize = b.gsize;
if (aSize !== aSize)
return aSize - bSize;
return a.glow - b.glow;
});
테스트되지 않았지만 작동해야한다고 생각합니다.
이것이 내가 사용하는 것입니다
function sort(a, b) {
var _a = "".concat(a.size, a.glow);
var _b = "".concat(b.size, b.glow);
return _a < _b;
}
두 항목을 문자열로 연결하면 문자열 값으로 정렬됩니다. 원하는 경우 _a 및 _b를 parseInt로 래핑하여 숫자가 될 것이라는 것을 알고 있으면 숫자로 비교할 수 있습니다.
다음은 특정 항목에 없을 수있는 우선 순위 정렬 키가있는 경우에 대한 해결책입니다. 따라서 대체 키를 기준으로 정렬해야합니다.
An input data example (id2 is priority sort key):
const arr = [
{id: 1},
{id: 2, id2: 3},
{id: 4},
{id: 3},
{id: 10, id2: 2},
{id: 7},
{id: 6, id2: 1},
{id: 5},
{id: 9, id2: 2},
{id: 8},
];
And the output should be:
[ { id: 6, id2: 1 },
{ id: 9, id2: 2 },
{ id: 10, id2: 2 },
{ id: 2, id2: 3 },
{ id: 1 },
{ id: 3 },
{ id: 4 },
{ id: 5 },
{ id: 7 },
{ id: 8 } ]
The comparator function will be like:
arr.sort((a,b) => {
if(a.id2 || b.id2) {
if(a.id2 && b.id2) {
if(a.id2 === b.id2) {
return a.id - b.id;
}
return a.id2 - b.id2;
}
return a.id2 ? -1 : 1;
}
return a.id - b.id
});
P.S. In case if .id of .id2 can be zeros, consider to use typeof.
참고URL : https://stackoverflow.com/questions/6129952/javascript-sort-array-by-two-fields
'Nice programing' 카테고리의 다른 글
| Excel에서 열의 모든 셀에 동일한 텍스트 추가 (0) | 2020.11.12 |
|---|---|
| 반응 형으로 텍스트 정렬을 변경 하시겠습니까 (Bootstrap 3 사용)? (0) | 2020.11.12 |
| Xcode 4로 내 앱을 현지화하는 방법은 무엇입니까? (0) | 2020.11.12 |
| PostgreSQL에서 다 대다 관계를 구현하는 방법은 무엇입니까? (0) | 2020.11.12 |
| 변경 불가능한 비트 맵 충돌 오류 (0) | 2020.11.12 |