누구든지 JavaScript에서 2 차원 배열을 정렬하는 데 도움을 줄 수 있습니까?
다음 형식의 데이터가 있습니다.
[12, AAA]
[58, BBB]
[28, CCC]
[18, DDD]
정렬하면 다음과 같이 표시됩니다.
[12, AAA]
[18, DDD]
[28, CCC]
[58, BBB]
따라서 기본적으로 첫 번째 열을 기준으로 정렬합니다.
건배
누구든지 JavaScript에서 2 차원 배열을 정렬하는 데 도움을 줄 수 있습니까?
다음 형식의 데이터가 있습니다.
[12, AAA]
[58, BBB]
[28, CCC]
[18, DDD]
정렬하면 다음과 같이 표시됩니다.
[12, AAA]
[18, DDD]
[28, CCC]
[58, BBB]
따라서 기본적으로 첫 번째 열을 기준으로 정렬합니다.
건배
답변:
이것은 간단합니다.
var a = [[12, 'AAA'], [58, 'BBB'], [28, 'CCC'],[18, 'DDD']];
a.sort(sortFunction);
function sortFunction(a, b) {
if (a[0] === b[0]) {
return 0;
}
else {
return (a[0] < b[0]) ? -1 : 1;
}
}
두 번째 열을 기준으로 정렬하려면 다음을 수행하십시오.
a.sort(compareSecondColumn);
function compareSecondColumn(a, b) {
if (a[1] === b[1]) {
return 0;
}
else {
return (a[1] < b[1]) ? -1 : 1;
}
}
<나 >. 어쨌든, 나는 업데이트를 좋아한다 :)
첫 번째 열에 반복적 인 값이있을 수 있으므로 가장 좋은 방법은 다음을 사용하는 것입니다.
var arr = [[12, 'AAA'], [12, 'BBB'], [12, 'CCC'],[28, 'DDD'], [18, 'CCC'],[12, 'DDD'],[18, 'CCC'],[28, 'DDD'],[28, 'DDD'],[58, 'BBB'],[68, 'BBB'],[78, 'BBB']];
arr.sort(function(a,b) {
return a[0]-b[0]
});
이 시도
//WITH FIRST COLUMN
arr = arr.sort(function(a,b) {
return a[0] - b[0];
});
//WITH SECOND COLUMN
arr = arr.sort(function(a,b) {
return a[1] - b[1];
});
참고 : 원래 답변은 마이너스 (-) 대신보다 큼 (>)을 사용하여 주석이 잘못된 것으로 언급했습니다.
화살표 기능을 사용하고 두 번째 문자열 필드를 기준으로 정렬
var a = [[12, 'CCC'], [58, 'AAA'], [57, 'DDD'], [28, 'CCC'],[18, 'BBB']];
a.sort((a, b) => a[1].localeCompare(b[1]));
console.log(a)
나와 같은 사람이라면 정렬 기준이되는 열을 변경할 때마다 각 인덱스를 변경하고 싶지 않을 것입니다.
function sortByColumn(a, colIndex){
a.sort(sortFunction);
function sortFunction(a, b) {
if (a[colIndex] === b[colIndex]) {
return 0;
}
else {
return (a[colIndex] < b[colIndex]) ? -1 : 1;
}
}
return a;
}
var sorted_a = sortByColumn(a, 2);
특별한 것은 없습니다. 배열에서 특정 인덱스의 값을 반환하는 데 드는 비용을 절약 할 수 있습니다.
function sortByCol(arr, colIndex){
arr.sort(sortFunction)
function sortFunction(a, b) {
a = a[colIndex]
b = b[colIndex]
return (a === b) ? 0 : (a < b) ? -1 : 1
}
}
// Usage
var a = [[12, 'AAA'], [58, 'BBB'], [28, 'CCC'],[18, 'DDD']]
sortByCol(a, 0)
console.log(JSON.stringify(a))
// "[[12,"AAA"],[18,"DDD"],[28,"CCC"],[58,"BBB"]]"
a[colIndex]몇 번이고 사용 하고 있지만 나는 여기에서 그것을 잡습니다 a = a[colIndex]. 더 효율적입니다. 2. 나는 다른 맛을 사용하여 if더 짧게 만듭니다. 3. 함수 arr의 결과 로 반환되지 않습니다. sortByCol즉, 함수를 다른 참조를 만드는 데 사용할 수 없습니다. 도움이 되었기를 바랍니다.
내 사용 사례에는 수십 개의 열이 포함되어 있으므로 @jahroy의 답변을 약간 확장했습니다. (또한 @ charles-clayton이 동일한 아이디어를 가지고 있다는 사실을 깨달았습니다.)
정렬 기준으로 사용하려는 매개 변수를 전달하고 정렬 기능이 비교가 발생하도록 원하는 인덱스로 재정의됩니다.
var ID_COLUMN=0
var URL_COLUMN=1
findings.sort(compareByColumnIndex(URL_COLUMN))
function compareByColumnIndex(index) {
return function(a,b){
if (a[index] === b[index]) {
return 0;
}
else {
return (a[index] < b[index]) ? -1 : 1;
}
}
}
charles-clayton 및 @ vikas-gautam의 어깨에 서서 OP에서와 같이 열에 문자열이있는 경우 필요한 문자열 테스트를 추가했습니다.
return isNaN(a-b) ? (a === b) ? 0 : (a < b) ? -1 : 1 : a-b ;
이 테스트 isNaN(a-b)는 문자열을 숫자로 강제 변환 할 수 없는지 확인합니다. 가능한 경우 a-b테스트가 유효합니다.
엄격한 동등성 테스트 (a === b)는 항상 false를 반환 하므로 혼합 유형의 열을 정렬하면 항상 재미있는 결과를 얻을 수 있습니다 .
여기에서 MDN보기
Logger 테스트가 포함 된 전체 스크립트입니다. Google Apps Script를 사용합니다.
function testSort(){
function sortByCol(arr, colIndex){
arr.sort(sortFunction);
function sortFunction(a, b) {
a = a[colIndex];
b = b[colIndex];
return isNaN(a-b) ? (a === b) ? 0 : (a < b) ? -1 : 1 : a-b ; // test if text string - ie cannot be coerced to numbers.
// Note that sorting a column of mixed types will always give an entertaining result as the strict equality test will always return false
// see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness
}
}
// Usage
var a = [ [12,'12', 'AAA'],
[12,'11', 'AAB'],
[58,'120', 'CCC'],
[28,'08', 'BBB'],
[18,'80', 'DDD'],
]
var arr1 = a.map(function (i){return i;}).sort(); // use map to ensure tests are not corrupted by a sort in-place.
Logger.log("Original unsorted:\n " + JSON.stringify(a));
Logger.log("Vanilla sort:\n " + JSON.stringify(arr1));
sortByCol(a, 0);
Logger.log("By col 0:\n " + JSON.stringify(a));
sortByCol(a, 1);
Logger.log("By col 1:\n " + JSON.stringify(a));
sortByCol(a, 2);
Logger.log("By col 2:\n " + JSON.stringify(a));
/* vanilla sort returns " [
[12,"11","AAB"],
[12,"12","AAA"],
[18,"80","DDD"],
[28,"08","BBB"],
[58,"120","CCC"]
]
if col 0 then returns "[
[12,'12',"AAA"],
[12,'11', 'AAB'],
[18,'80',"DDD"],
[28,'08',"BBB"],
[58,'120',"CCC"]
]"
if col 1 then returns "[
[28,'08',"BBB"],
[12,'11', 'AAB'],
[12,'12',"AAA"],
[18,'80',"DDD"],
[58,'120',"CCC"],
]"
if col 2 then returns "[
[12,'12',"AAA"],
[12,'11', 'AAB'],
[28,'08',"BBB"],
[58,'120',"CCC"],
[18,'80',"DDD"],
]"
*/
}