[JQUERY] 정렬 배열 요소 (숫자 문자열), 자연 종류
JQUERY정렬 배열 요소 (숫자 문자열), 자연 종류
해결법
-
1.이는 "자연 일종의"라고하며 다음과 같이 JS에서 구현 될 수있다 :
이는 "자연 일종의"라고하며 다음과 같이 JS에서 구현 될 수있다 :
함수 naturalCompare (a, b) { VAR 도끼 = [], BX = []; a.replace (/ (\ + D)를 (| \ D +) / g, 함수 (_ $ 1, $ 2) {ax.push ([$ 1 || 무한대 $ 2 || ''])}); b.replace (/ (\ + D)를 (| \ D +) / g, 함수 (_ $ 1, $ 2) {bx.push ([$ 1 || 무한대 $ 2 || ''])}); 반면 (ax.length && bx.length) { VAR = ax.shift을 (); VAR BN = bx.shift (); VAR = NN (이 [0] - BN [0]) || 이 [1] .localeCompare (단위 [1]); (NN) 반환 윈 경우; } ax.length을 반환 - bx.length을; } ///////////////////////// 테스트 = "img12.png" "img10.png" "img2.png" "img1.png" "img101.png" "img101a.png" "abc10.jpg" "abc10" "abc2.jpg" "20.jpg" "20", "알파벳", "abc2" "" ]; test.sort (naturalCompare) document.write를 ( "<사전>"+ JSON.stringify (시험 0,3));
역순으로 정렬하려면, 단지 인수를 교환 :
test.sort(function(a, b) { return naturalCompare(b, a) })
또는 단순히
test = test.sort(naturalCompare).reverse();
-
2.당신은 옵션 문자열 # localeCompare를 사용할 수 있습니다
당신은 옵션 문자열 # localeCompare를 사용할 수 있습니다
VAR 어레이 = "IL0 푸", "PI0 바", "IL10 바즈는", "IL3 밥 안부"]; {() 함수 (A, B를에 Array.sort 창 a.localeCompare (b, 미정 {숫자 : 사실, 감도 '기부'}); }); CONSOLE.LOG (배열);
-
3.
var re = /([a-z]+)(\d+)(.+)/i; var arr = ["IL0 Foo", "PI0 Bar", "IL10 Baz", "IL3 Bob says hello"]; var order = arr.sort( function(a,b){ var ma = a.match(re), mb = b.match(re), a_str = ma[1], b_str = mb[1], a_num = parseInt(ma[2],10), b_num = parseInt(mb[2],10), a_rem = ma[3], b_rem = mb[3]; return a_str > b_str ? 1 : a_str < b_str ? -1 : a_num > b_num ? 1 : a_num < b_num ? -1 : a_rem > b_rem; });
-
4.나는 게오르그의 솔루션을 많이 좋아하지만 난 숫자 앞에 정렬 ( "_") 밑줄을 필요로했다. 여기에 자신의 코드를 수정하는 방법은 다음과 같습니다
나는 게오르그의 솔루션을 많이 좋아하지만 난 숫자 앞에 정렬 ( "_") 밑줄을 필요로했다. 여기에 자신의 코드를 수정하는 방법은 다음과 같습니다
VAR chunkRgx = / (_ +) | ([0-9] +) | ([^ _ 0-9] +) / g; 함수 naturalCompare (a, b) { VAR 도끼 = [], BX = []; a.replace (chunkRgx 함수 (_ $ 1, $ 2 $ 3) { ax.push ([$ 1 || "0"$ 2 || 무한대 $ 3은 || '']) }); b.replace (chunkRgx 함수 (_ $ 1, $ 2 $ 3) { bx.push ([$ 1 || "0"$ 2 || 무한대 $ 3은 || '']) }); 반면 (ax.length && bx.length) { VAR = ax.shift을 (); VAR BN = bx.shift (); VAR = NN이 [0] .localeCompare (단위 [0]) || (이 [1] - BN [1]) || 이 [2] .localeCompare (단위 [2]); (NN) 반환 윈 경우; } ax.length을 반환 - bx.length을; } ///////////////////////// 테스트 = "img12.png" "img10.png" "img2.png" "img1.png" "img101.png" "img101a.png" "abc10.jpg" "abc10" "abc2.jpg" "20.jpg" "20", "알파벳", "abc2" "_알파벳", "_알파벳", "_알파벳", "_abc_d" "AB_" "알파벳_", "_ab_cd" "" ]; test.sort (naturalCompare) document.write를 ( "<사전>"+ JSON.stringify (시험 0,3));
-
5.종류 일반적으로 다음 앞에 0을 가진 문자열 패드 번호.
종류 일반적으로 다음 앞에 0을 가진 문자열 패드 번호.
VAR naturalSort 함수 = (a, b) { A = ( '+ a) .replace (/ (\ D +) / g, 함수 (N) {창 (0000 + N) .slice (-5)}); B = ( '+ b) .replace (/ (\ D +) / g, 함수 (N) {창 (0000 + N) .slice (-5)}); 창 a.localeCompare (b); } VAR naturalSortModern 함수 = (a, b) { 창 ( '+ a) .localeCompare (('+ b) 'EN'{숫자 : TRUE}); } console.dir (([ "IL0 푸", "PI0 바", "IL10 바즈는", "IL3 밥 안부"] 종류 (naturalSort)).); console.dir (([ "IL0 푸", "PI0 바", "IL10 바즈는", "IL3 밥 안부"] 종류 (naturalSortModern)).);
-
6.당신은 숫자가 아닌 및 문자열의 숫자 부분을 얻기 위해이 같은 정규식을 할 수있는 :
당신은 숫자가 아닌 및 문자열의 숫자 부분을 얻기 위해이 같은 정규식을 할 수있는 :
var s = "foo124bar23"; s.match(/[^\d]+|\d+/g)
반환 : [ "foo는", "124", "바", "23"]
그런 다음 비교 기능에 당신은 그 부분별로 부분을 비교 두 문자열의 부분을 반복 할 수 있습니다. 제 일치하지 않는 부분은 전체의 비교 결과를 결정한다. 각각의 경우, 숫자로 시작하는 부분인지 확인하고 만약 그렇게 비교를 수행하기 전에 숫자로 분석.
-
7.(왜 안) 하나 더 다른 추가
(왜 안) 하나 더 다른 추가
var ary = ["IL0 Foo", "PI0 Bar", "IL10 Hello", "IL10 Baz", "IL3 Bob says hello"]; // break out the three components in to an array // "IL10 Bar" => ['IL', 10, 'Bar'] function getParts(i){ i = i || ''; var parts = i.match(/^([a-z]+)([0-9]+)(\s.*)$/i); if (parts){ return [ parts[1], parseInt(parts[2], 10), parts[3] ]; } return []; // erroneous } ary.sort(function(a,b){ // grab the parts var _a = getParts(a), _b = getParts(b); // trouble parsing (both fail = no shift, otherwise // move the troubles element to end of the array) if(_a.length == 0 && _b.length == 0) return 0; if(_a.length == 0) return -1; if(_b.length == 0) return 1; // Compare letter portion if (_a[0] < _b[0]) return -1; if (_a[0] > _b[0]) return 1; // letters are equal, continue... // compare number portion if (_a[1] < _b[1]) return -1; if (_a[1] > _b[1]) return 1; // numbers are equal, continue... // compare remaining string if (_a[2] < _b[2]) return -1; if (_a[2] > _b[2]) return 1; // strings are equal, continue... // exact match return 0; });
jsfiddle 예
-
8.아니 꽤 있지만, 처음 두 문자 코드를 확인합니다. 모두 동일하게 해석하는 경우와 숫자를 비교 :
아니 꽤 있지만, 처음 두 문자 코드를 확인합니다. 모두 동일하게 해석하는 경우와 숫자를 비교 :
var arr = ["IL0 Foo", "IL10 Baz", "IL3 Bob says hello", "PI0 Bar"]; arr.sort(function (a1, b1) { var a = parseInt(a1.match(/\d+/g)[0], 10), b = parseInt(b1.match(/\d+/g)[0], 10), letterA = a1.charCodeAt(0), letterB = b1.charCodeAt(0), letterA1 = a1.charCodeAt(1), letterB1 = b1.charCodeAt(1); if (letterA > letterB) { return 1; } else if (letterB > letterA) { return -1; } else { if (letterA1 > letterB1) { return 1; } else if (letterB1 > letterA1) { return -1; } if (a < b) return -1; if (a > b) return 1; return 0; } });
예
from https://stackoverflow.com/questions/15478954/sort-array-elements-string-with-numbers-natural-sort by cc-by-sa and MIT license
'JQUERY' 카테고리의 다른 글
[JQUERY] 어떻게 난 단지 코너 테두리를 표시 할 수 있습니다? (0) | 2020.10.03 |
---|---|
[JQUERY] 크롬에서 옵션을 선택 요소에 이벤트를 클릭 (0) | 2020.10.03 |
[JQUERY] Access 개체 도트 표기법 문자열을 사용하여 자식 속성 [중복] (0) | 2020.10.03 |
[JQUERY] 액세스 제어 요청 헤더, jQuery로 AJAX 요청의 헤더에 추가한다 (0) | 2020.10.03 |
[JQUERY] 어떻게 jQuery를 사용하여 키보드의 Enter 키를 눌러 감지? (0) | 2020.10.03 |