복붙노트

[JQUERY] 정렬 배열 요소 (숫자 문자열), 자연 종류

JQUERY

정렬 배열 요소 (숫자 문자열), 자연 종류

해결법


  1. 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. 2.당신은 옵션 문자열 # localeCompare를 사용할 수 있습니다

    당신은 옵션 문자열 # localeCompare를 사용할 수 있습니다

    VAR 어레이 = "IL0 푸", "PI0 바", "IL10 바즈는", "IL3 밥 안부"]; {() 함수 (A, B를에 Array.sort 창 a.localeCompare (b, 미정 {숫자 : 사실, 감도 '기부'}); }); CONSOLE.LOG (배열);


  3. 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. 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. 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. 6.당신은 숫자가 아닌 및 문자열의 숫자 부분을 얻기 위해이 같은 정규식을 할 수있는 :

    당신은 숫자가 아닌 및 문자열의 숫자 부분을 얻기 위해이 같은 정규식을 할 수있는 :

    var s = "foo124bar23";
    s.match(/[^\d]+|\d+/g)
    

    반환 : [ "foo는", "124", "바", "23"]

    그런 다음 비교 기능에 당신은 그 부분별로 부분을 비교 두 문자열의 부분을 반복 할 수 있습니다. 제 일치하지 않는 부분은 전체의 비교 결과를 결정한다. 각각의 경우, 숫자로 시작하는 부분인지 확인하고 만약 그렇게 비교를 수행하기 전에 숫자로 분석.


  7. 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. 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;
        }
    });
    

  9. from https://stackoverflow.com/questions/15478954/sort-array-elements-string-with-numbers-natural-sort by cc-by-sa and MIT license