값을 기준으로 JSON 정렬
다음과 같은 매우 단순한 JSON 오브젝트가 있습니다.
{
"people":[
{
"f_name":"john",
"l_name":"doe",
"sequence":"0",
"title":"president",
"url":"google.com",
"color":"333333"
},
{
"f_name":"michael",
"l_name":"goodyear",
"sequence":"0",
"title":"general manager",
"url":"google.com",
"color":"333333"
}
]
}
서버측 코드에서 이 코드가 반환되었으므로jQuery.each
필요한 html을 형성하여 결과를 출력합니다.
지금 하고 있는 것은, 「Title DESC」등의 정렬 정보를 포함한 서버에 AJAX 콜을 송신해, SQL 쿼리를 재실행해 새로운 결과 세트를 반환하는 것입니다.단, 이를 피하고 jQuery를 사용하여 결과 JSON을 정렬하여 서버로의 라운드 트립과 다중 데이터베이스 액세스를 방지하고 싶습니다.
jQuery를 사용하여 이 작업을 수행하려면 어떻게 해야 합니까?
jQuery는 정렬에 특별히 도움이 되는 것은 아니지만, 여기 우아하고 효율적인 솔루션이 있습니다.속성명과 순서(오름차순 또는 내림차순)를 사용하여 네이티브 sort() 메서드를 단순한 비교 함수로 호출하는 플레인 JS 함수를 작성합니다.
var people = [
{
"f_name": "john",
"l_name": "doe",
"sequence": "0",
"title" : "president",
"url" : "google.com",
"color" : "333333",
}
// etc
];
function sortResults(prop, asc) {
people.sort(function(a, b) {
if (asc) {
return (a[prop] > b[prop]) ? 1 : ((a[prop] < b[prop]) ? -1 : 0);
} else {
return (b[prop] > a[prop]) ? 1 : ((b[prop] < a[prop]) ? -1 : 0);
}
});
renderResults();
}
그 후, 다음과 같이 입력합니다.
sortResults('l_name', true);
여기서 작업 예제를 사용해 보십시오.
데모: https://jsfiddle.net/kvxazhso/
동일한 값을 성공적으로 전달합니다(같은 순서를 유지).Flexible : 상승(123) 또는 하강(321), 숫자, 문자 및 유니코드용으로 동작합니다.테스트된 모든 장치(Chrome, Android 기본 브라우저, FF)에서 작동합니다.
다음과 같은 데이터가 지정됩니다.
var people = [
{ 'myKey': 'A', 'status': 0 },
{ 'myKey': 'B', 'status': 3 },
{ 'myKey': 'C', 'status': 3 },
{ 'myKey': 'D', 'status': 2 },
{ 'myKey': 'E', 'status': 7 },
...
];
오름차순 또는 역순으로 정렬:
function sortJSON(arr, key, way) {
return arr.sort(function(a, b) {
var x = a[key]; var y = b[key];
if (way === '123') { return ((x < y) ? -1 : ((x > y) ? 1 : 0)); }
if (way === '321') { return ((x > y) ? -1 : ((x < y) ? 1 : 0)); }
});
}
people2 = sortJSON(people,'status', '321'); // 123 or 321
alert("2. After processing (0 to x if 123; x to 0 if 321): "+JSON.stringify(people2));
jQuery.fn.sort = function() {
return this.pushStack( [].sort.apply( this, arguments ), []);
};
function sortLastName(a,b){
if (a.l_name == b.l_name){
return 0;
}
return a.l_name> b.l_name ? 1 : -1;
};
function sortLastNameDesc(a,b){
return sortLastName(a,b) * -1;
};
var people= [
{
"f_name": "john",
"l_name": "doe",
"sequence": "0",
"title" : "president",
"url" : "google.com",
"color" : "333333",
},
{
"f_name": "michael",
"l_name": "goodyear",
"sequence": "0",
"title" : "general manager",
"url" : "google.com",
"color" : "333333",
}]
sorted=$(people).sort(sortLastNameDesc);
외부 라이브러리를 사용해도 괜찮으시다면, Lodash에는 훌륭한 유틸리티가 많이 있습니다.
var people = [
{
"f_name":"john",
"l_name":"doe",
"sequence":"0",
"title":"president",
"url":"google.com",
"color":"333333"
},
{
"f_name":"michael",
"l_name":"goodyear",
"sequence":"0",
"title":"general manager",
"url":"google.com",
"color":"333333"
}
];
var sorted = _.sortBy(people, "l_name")
여러 속성을 기준으로 정렬할 수도 있습니다.이 플렁크가 동작하고 있습니다.
다양한 타입과 대소문자를 사용하는 솔루션.
예를 들어, performation confirm, confirm에toLowerCase
"Good year"는 "doe" 앞에 오름차순으로 표시됩니다.내 답변 하단에 있는 코드 스니펫을 실행하여 다양한 동작을 확인합니다.
JSON 데이터:
var people = [
{
"f_name" : "john",
"l_name" : "doe", // lower case
"sequence": 0 // int
},
{
"f_name" : "michael",
"l_name" : "Goodyear", // upper case
"sequence" : 1 // int
}];
JSON 정렬 기능:
function sortJson(element, prop, propType, asc) {
switch (propType) {
case "int":
element = element.sort(function (a, b) {
if (asc) {
return (parseInt(a[prop]) > parseInt(b[prop])) ? 1 : ((parseInt(a[prop]) < parseInt(b[prop])) ? -1 : 0);
} else {
return (parseInt(b[prop]) > parseInt(a[prop])) ? 1 : ((parseInt(b[prop]) < parseInt(a[prop])) ? -1 : 0);
}
});
break;
default:
element = element.sort(function (a, b) {
if (asc) {
return (a[prop].toLowerCase() > b[prop].toLowerCase()) ? 1 : ((a[prop].toLowerCase() < b[prop].toLowerCase()) ? -1 : 0);
} else {
return (b[prop].toLowerCase() > a[prop].toLowerCase()) ? 1 : ((b[prop].toLowerCase() < a[prop].toLowerCase()) ? -1 : 0);
}
});
}
}
사용방법:
sortJson(people , "l_name", "string", true);
sortJson(people , "sequence", "int", true);
var people = [{
"f_name": "john",
"l_name": "doe",
"sequence": 0
}, {
"f_name": "michael",
"l_name": "Goodyear",
"sequence": 1
}, {
"f_name": "bill",
"l_name": "Johnson",
"sequence": 4
}, {
"f_name": "will",
"l_name": "malone",
"sequence": 2
}, {
"f_name": "tim",
"l_name": "Allen",
"sequence": 3
}];
function sortJsonLcase(element, prop, asc) {
element = element.sort(function(a, b) {
if (asc) {
return (a[prop] > b[prop]) ? 1 : ((a[prop] < b[prop]) ? -1 : 0);
} else {
return (b[prop] > a[prop]) ? 1 : ((b[prop] < a[prop]) ? -1 : 0);
}
});
}
function sortJson(element, prop, propType, asc) {
switch (propType) {
case "int":
element = element.sort(function(a, b) {
if (asc) {
return (parseInt(a[prop]) > parseInt(b[prop])) ? 1 : ((parseInt(a[prop]) < parseInt(b[prop])) ? -1 : 0);
} else {
return (parseInt(b[prop]) > parseInt(a[prop])) ? 1 : ((parseInt(b[prop]) < parseInt(a[prop])) ? -1 : 0);
}
});
break;
default:
element = element.sort(function(a, b) {
if (asc) {
return (a[prop].toLowerCase() > b[prop].toLowerCase()) ? 1 : ((a[prop].toLowerCase() < b[prop].toLowerCase()) ? -1 : 0);
} else {
return (b[prop].toLowerCase() > a[prop].toLowerCase()) ? 1 : ((b[prop].toLowerCase() < a[prop].toLowerCase()) ? -1 : 0);
}
});
}
}
function sortJsonString() {
sortJson(people, 'l_name', 'string', $("#chkAscString").prop("checked"));
display();
}
function sortJsonInt() {
sortJson(people, 'sequence', 'int', $("#chkAscInt").prop("checked"));
display();
}
function sortJsonUL() {
sortJsonLcase(people, 'l_name', $('#chkAsc').prop('checked'));
display();
}
function display() {
$("#data").empty();
$(people).each(function() {
$("#data").append("<div class='people'>" + this.l_name + "</div><div class='people'>" + this.f_name + "</div><div class='people'>" + this.sequence + "</div><br />");
});
}
body {
font-family: Arial;
}
.people {
display: inline-block;
width: 100px;
border: 1px dotted black;
padding: 5px;
margin: 5px;
}
.buttons {
border: 1px solid black;
padding: 5px;
margin: 5px;
float: left;
width: 20%;
}
ul {
margin: 5px 0px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="buttons" style="background-color: rgba(240, 255, 189, 1);">
Sort the JSON array <strong style="color: red;">with</strong> toLowerCase:
<ul>
<li>Type: string</li>
<li>Property: lastname</li>
</ul>
<button onclick="sortJsonString(); return false;">Sort JSON</button>
Asc Sort
<input id="chkAscString" type="checkbox" checked="checked" />
</div>
<div class="buttons" style="background-color: rgba(255, 214, 215, 1);">
Sort the JSON array <strong style="color: red;">without</strong> toLowerCase:
<ul>
<li>Type: string</li>
<li>Property: lastname</li>
</ul>
<button onclick="sortJsonUL(); return false;">Sort JSON</button>
Asc Sort
<input id="chkAsc" type="checkbox" checked="checked" />
</div>
<div class="buttons" style="background-color: rgba(240, 255, 189, 1);">
Sort the JSON array:
<ul>
<li>Type: int</li>
<li>Property: sequence</li>
</ul>
<button onclick="sortJsonInt(); return false;">Sort JSON</button>
Asc Sort
<input id="chkAscInt" type="checkbox" checked="checked" />
</div>
<br />
<br />
<div id="data" style="float: left; border: 1px solid black; width: 60%; margin: 5px;">Data</div>
여기 다단계 정렬 방법이 있습니다.Angular JS 모듈의 일부를 포함하지만 정렬 함수가 액세스할 수 있도록 정렬 키 개체의 범위를 지정하면 동일한 작업을 수행할 수 있습니다.풀 모듈은 Plunker에서 볼 수 있습니다.
$scope.sortMyData = function (a, b)
{
var retVal = 0, key;
for (var i = 0; i < $scope.sortKeys.length; i++)
{
if (retVal !== 0)
{
break;
}
else
{
key = $scope.sortKeys[i];
if ('asc' === key.direction)
{
retVal = (a[key.field] < b[key.field]) ? -1 : (a[key.field] > b[key.field]) ? 1 : 0;
}
else
{
retVal = (a[key.field] < b[key.field]) ? 1 : (a[key.field] > b[key.field]) ? -1 : 0;
}
}
}
return retVal;
};
언급URL : https://stackoverflow.com/questions/881510/sorting-json-by-values
'it-source' 카테고리의 다른 글
각도 JS 사용자 지정 구분 기호 (0) | 2023.03.17 |
---|---|
웹 팩 파일 로더를 사용하여 이미지 파일을 로드하는 방법 (0) | 2023.03.17 |
화면으로 돌아가면 React Native에서 useEffect가 호출되지 않음 (0) | 2023.03.17 |
Spring Boot : 데이터베이스에서 @Scheduled cron 값을 가져옵니다. (0) | 2023.03.17 |
컨트롤러 함수에 대한 호출이 기능하지 않는 각도 ng클릭 (0) | 2023.03.17 |