반응형
여러 필드(숫자)에 의한 JavaScript 배열 정렬
의 실장착할 수 있을까요?
ORDER BY sort1 DESC, sort2 DESC
JSON 어레이의 로직은 다음과 같습니다.
var items = '[
{
"sort1": 1,
"sort2": 3,
"name" : "a",
},
{
"sort1": 1,
"sort2": 2,
"name" : "b",
},
{
"sort1": 2,
"sort2": 1,
"name" : "c",
}
]';
새로운 순서가 됩니다.
b,a,c
정렬 기능은 다음과 같이 설계해야 합니다.
items.sort(function(a, b) {
return a.sort1 - b.sort1 || a.sort2 - b.sort2;
});
(왜냐하면||
연산자의 우선순위는 보다 낮다.-
첫째, 여기서는 괄호를 사용할 필요가 없습니다.)
논리는 간단합니다.a.sort1 - b.sort1
표현식은 0으로 평가됩니다(따라서 이러한 속성은 동일함), 평가됩니다.||
expression - 결과를 반환합니다.a.sort2 - b.sort2
.
사이드노트로서items
실제로는 문자열 리터럴입니다.JSON.parse
어레이를 가져오려면:
const itemsStr = `[{
"sort1": 1,
"sort2": 3,
"name": "a"
},
{
"sort1": 1,
"sort2": 2,
"name": "b"
},
{
"sort1": 2,
"sort2": 1,
"name": "c"
}
]`;
const items = JSON.parse(itemsStr);
items.sort((a, b) => a.sort1 - b.sort1 || a.sort2 - b.sort2);
console.log(items);
일반 함수를 생성하여 하드코딩을 방지할 수 있습니다.
function sortByMultipleKey(keys) {
return function(a, b) {
if (keys.length == 0) return 0; // force to equal if keys run out
key = keys[0]; // take out the first key
if (a[key] < b[key]) return -1; // will be 1 if DESC
else if (a[key] > b[key]) return 1; // will be -1 if DESC
else return sortByMultipleKey(keys.slice(1))(a, b);
}
}
입니다.
items.sort(sortByMultipleKey(['sort1', 'sort2']));
너를 가질 것이다
[ { sort1: 1, sort2: 2, name: 'b' },
{ sort1: 1, sort2: 3, name: 'a' },
{ sort1: 2, sort2: 1, name: 'c' } ]
const itemsStr = `[{
"sort1": 1,
"sort2": 3,
"name": "a"
},
{
"sort1": 1,
"sort2": 2,
"name": "b"
},
{
"sort1": 2,
"sort2": 1,
"name": "c"
}
]`;
const items = JSON.parse(itemsStr);
items.sort((a, b) => a.sort1 - b.sort1 || a.sort2 - b.sort2);
console.log(items);
언급URL : https://stackoverflow.com/questions/13211709/javascript-sort-array-by-multiple-number-fields
반응형
'it-source' 카테고리의 다른 글
숫자인 PHP 개체 속성을 가져옵니다. (0) | 2023.02.08 |
---|---|
firebase.firebase는 함수가 아닙니다. (0) | 2023.02.08 |
AngularJ: ngInclude vs 디렉티브 (0) | 2023.02.08 |
WooCommerce 카트에 카트 아이템의 제품 ID를 가져옵니다. (0) | 2023.02.08 |
jQuery에 XML이 아닌 JSON을 선택하는 이유는 무엇입니까? (0) | 2023.02.08 |