복붙노트

[JQUERY] 정렬 혼합 알파 / 숫자 배열

JQUERY

정렬 혼합 알파 / 숫자 배열

해결법


  1. 1.VAR REA = / [^ A-ZA-Z] / g; VAR REN = / [^ 0-9] / g; 함수 sortAlphaNum (a, b) { VAR AA = a.replace (REA ' "); VAR BA = b.replace (REA ' "); 경우 (AA === BA) { VAR에서 aN =에서는 parseInt (a.replace (REN ''), 10); VAR BN =에서는 parseInt (b.replace (REN ''), 10); 에서 aN === 억을 반환? 0 :는> BN? 1 : 27; } 다른 { 반환 AA> BA? 1 : 27; } } CONSOLE.LOG ( [ "A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"]. 종류 (sortAlphaNum) )

    VAR REA = / [^ A-ZA-Z] / g; VAR REN = / [^ 0-9] / g; 함수 sortAlphaNum (a, b) { VAR AA = a.replace (REA ' "); VAR BA = b.replace (REA ' "); 경우 (AA === BA) { VAR에서 aN =에서는 parseInt (a.replace (REN ''), 10); VAR BN =에서는 parseInt (b.replace (REN ''), 10); 에서 aN === 억을 반환? 0 :는> BN? 1 : 27; } 다른 { 반환 AA> BA? 1 : 27; } } CONSOLE.LOG ( [ "A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"]. 종류 (sortAlphaNum) )


  2. 2.

    const sortAlphaNum = (a, b) => a.localeCompare(b, 'en', { numeric: true })`
    

    용법:

    CONST sortAlphaNum = (a, b) => a.localeCompare (b 'EN'{숫자 : TRUE}) CONSOLE.LOG ([ 'A1', 'A10', 'A11', 'A12', 'A2', 'A3', 'A4', 'B10' ', B2', 'F1', 'F12', ' F3 ']. 정렬 (sortAlphaNum))

    제공합니다 :

    "A1"w "A2", "아즈", "A4", "A10", "A11", "A12", "B2", "B10", "F1", "FL", "F12"U를

    당신은 당신의 로케일로 '엉'인수를 변경하거나 프로그래밍 방식으로 결정해야하지만이 영어 문자열을 사용할 수 있습니다.

    localeCompare는 IE11, 크롬, 파이어 폭스, 에지 및 사파리 (10)에 의해 지원됩니다.


  3. 3.나는 비슷한 상황이 있었다,하지만, 숫자 및 숫자의 혼합을했고, 그래서 첫 번째 숫자 다음에 모든 숫자를 정렬 할 필요 :

    나는 비슷한 상황이 있었다,하지만, 숫자 및 숫자의 혼합을했고, 그래서 첫 번째 숫자 다음에 모든 숫자를 정렬 할 필요 :

    A10
    1
    5
    A9
    2
    B3
    A2
    

    되기 위해 필요한 :

    1
    2
    5
    A2
    A9
    A10
    B3
    

    나는 제공된 알고리즘을 사용하고 더는 이러한 목표를 달성하기에 조금 해킹 할 수 있었다 :

    var reA = /[^a-zA-Z]/g;
    var reN = /[^0-9]/g;
    function sortAlphaNum(a,b) {
        var AInt = parseInt(a, 10);
        var BInt = parseInt(b, 10);
    
        if(isNaN(AInt) && isNaN(BInt)){
            var aA = a.replace(reA, "");
            var bA = b.replace(reA, "");
            if(aA === bA) {
                var aN = parseInt(a.replace(reN, ""), 10);
                var bN = parseInt(b.replace(reN, ""), 10);
                return aN === bN ? 0 : aN > bN ? 1 : -1;
            } else {
                return aA > bA ? 1 : -1;
            }
        }else if(isNaN(AInt)){//A is not an Int
            return 1;//to make alphanumeric sort first return -1 here
        }else if(isNaN(BInt)){//B is not an Int
            return -1;//to make alphanumeric sort first return 1 here
        }else{
            return AInt > BInt ? 1 : -1;
        }
    }
    var newlist = ["A1", 1, "A10", "A11", "A12", 5, 3, 10, 2, "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"].sort(sortAlphaNum);
    

  4. 4.이 작업을 수행하는 간단한 방법은 자바 스크립트 https://www.w3schools.com/jsref/jsref_localecompare.asp의 localeCompare () 메서드를 사용하다

    이 작업을 수행하는 간단한 방법은 자바 스크립트 https://www.w3schools.com/jsref/jsref_localecompare.asp의 localeCompare () 메서드를 사용하다

    예:

    export const sortAlphaNumeric = (a, b) => {
        // convert to strings and force lowercase
        a = typeof a === 'string' ? a.toLowerCase() : a.toString();
        b = typeof b === 'string' ? b.toLowerCase() : b.toString();
    
        return a.localeCompare(b);
    };
    

    예상되는 동작 :

    1000X Radonius Maximus
    10X Radonius
    200X Radonius
    20X Radonius
    20X Radonius Prime
    30X Radonius
    40X Radonius
    Allegia 50 Clasteron
    Allegia 500 Clasteron
    Allegia 50B Clasteron
    Allegia 51 Clasteron
    Allegia 6R Clasteron
    Alpha 100
    Alpha 2
    Alpha 200
    Alpha 2A
    Alpha 2A-8000
    Alpha 2A-900
    Callisto Morphamax
    Callisto Morphamax 500
    Callisto Morphamax 5000
    Callisto Morphamax 600
    Callisto Morphamax 6000 SE
    Callisto Morphamax 6000 SE2
    Callisto Morphamax 700
    Callisto Morphamax 7000
    Xiph Xlater 10000
    Xiph Xlater 2000
    Xiph Xlater 300
    Xiph Xlater 40
    Xiph Xlater 5
    Xiph Xlater 50
    Xiph Xlater 500
    Xiph Xlater 5000
    Xiph Xlater 58
    

  5. 5.

    var a1 =["A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"];
    
    var a2 = a1.sort(function(a,b){
        var charPart = [a.substring(0,1), b.substring(0,1)],
            numPart = [a.substring(1)*1, b.substring(1)*1];
    
        if(charPart[0] < charPart[1]) return -1;
        else if(charPart[0] > charPart[1]) return 1;
        else{ //(charPart[0] == charPart[1]){
            if(numPart[0] < numPart[1]) return -1;
            else if(numPart[0] > numPart[1]) return 1;
            return 0;
        }
    });
    
    $('#r').html(a2.toString())
    

    http://jsfiddle.net/8fRsD/


  6. 6.이 그것을 할 수 있습니다 :

    이 그것을 할 수 있습니다 :

    함수 parseItem (항목) { CONST [stringPart = ''numberPart = 0] = /(^[a-zA-Z]*)(\d*)$/.exec(item) || []; 창 [stringPart, numberPart]; } 함수 정렬 (배열) { 복귀에 Array.sort ((a, b) => { CONST [stringA, numberA = parseItem (a); CONST [stringB, numberB = parseItem (b); CONST 비교 = stringA.localeCompare (stringB); 반환 비교 === 0? 수 (numberA) - 수 (numberB) : 비교; }); } CONSOLE.LOG (정렬 ([ 'A1', 'A10', 'A11', 'A12', 'A2', 'A3', 'A4', 'B10' ', B2', 'F1', 'F12' 'F3'])) CONSOLE.LOG (정렬 ([ 'a25b', 'AB', 'a37b']))


  7. 7.당신은 Intl.Collator을 사용할 수 있습니다

    당신은 Intl.Collator을 사용할 수 있습니다

    그것은 여기 localeCompare 읽기를 통해 성능 이점을

    브라우저 비교 (모든 브라우저 지원을)

    도착 = "A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3하자 "] ({: 사실, 감도 : 숫자 '악센트'} ( '엉'을, 새로운 Intl.Collator) 비교.) 연산 = arr.sort하자 CONSOLE.LOG (OP)


  8. 8.내가 댓글 수 없기 때문에, epascarello에서 허용 대답에 추가. 나는 아직도 여기 멍청한 놈입니다. strinngs 중 하나가 숫자가없는 경우에는 원래의 대답은 작동하지 않습니다. 예를 들어 A와 A10를 들어 순서대로 정렬되지 않습니다. 따라서 당신은이 경우에 정상 종류로 다시 이동 wamnt 수 있습니다.

    내가 댓글 수 없기 때문에, epascarello에서 허용 대답에 추가. 나는 아직도 여기 멍청한 놈입니다. strinngs 중 하나가 숫자가없는 경우에는 원래의 대답은 작동하지 않습니다. 예를 들어 A와 A10를 들어 순서대로 정렬되지 않습니다. 따라서 당신은이 경우에 정상 종류로 다시 이동 wamnt 수 있습니다.

    var reA = /[^a-zA-Z]/g;
    var reN = /[^0-9]/g;
    function sortAlphaNum(a,b) {
        var aA = a.replace(reA, "");
        var bA = b.replace(reA, "");
        if(aA === bA) {
          var aN = parseInt(a.replace(reN, ""), 10);
          var bN = parseInt(b.replace(reN, ""), 10);
          if(isNaN(bN) || isNaN(bN)){
            return  a > b ? 1 : -1;
          }
          return aN === bN ? 0 : aN > bN ? 1 : -1;
        } else {
         return aA > bA ? 1 : -1;
        }
     }
     ["A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12","F3"].sort(sortAlphaNum);`
    

  9. 9.상기 제공된 용액 유일한 문제는 수치 데이터가 동일 및 알파벳 예컨대 변할 때 논리 실패이었다 28AB, 28PQR, 28HBC. 다음은 수정 된 코드입니다.

    상기 제공된 용액 유일한 문제는 수치 데이터가 동일 및 알파벳 예컨대 변할 때 논리 실패이었다 28AB, 28PQR, 28HBC. 다음은 수정 된 코드입니다.

    var reA = /[^a-zA-Z]/g;
        var reN = /[^0-9]/g;
        var AInt = parseInt(a, 10);
        var BInt = parseInt(b, 10);
        if(isNaN(AInt) && isNaN(BInt)){
            var aA = a.replace(reA, "");
            var bA = b.replace(reA, "");
            if(aA === bA) {
                var aN = parseInt(a.replace(reN, ""), 10);
                var bN = parseInt(b.replace(reN, ""), 10);
                alert("in if "+aN+" : "+bN);
                return aN === bN ? 0 : aN > bN ? 1 : -1;
            } else {
                return aA > bA ? 1 : -1;
            }
        }else if(isNaN(AInt)){//A is not an Int
            return 1;//to make alphanumeric sort first return 1 here
        }else if(isNaN(BInt)){//B is not an Int
            return -1;//to make alphanumeric sort first return -1 here
        }else if(AInt == BInt) {
            var aA = a.replace(reA, "");
            var bA = b.replace(reA, "");
            return aA > bA ? 1 : -1;
        }
        else {
            return AInt > BInt ? 1 : -1;
        }
    

  10. 10.나는 최근 재고 및 빈 위치를 포함하는 프로젝트에서 일했다. 필요한 데이터는 빈 위치로 정렬 및 오브젝트의 배열에 참여한다.

    나는 최근 재고 및 빈 위치를 포함하는 프로젝트에서 일했다. 필요한 데이터는 빈 위치로 정렬 및 오브젝트의 배열에 참여한다.

    누군가가이 유형의 데이터의 정렬 및 데이터 객체의 배열에 처리하고자하는 경우, 당신은이 작업을 수행 할 수 있습니다 :

    CONST에서 myArray = {위치 'B3'항목 'A', 수량 : 25}, {위치 'A11'항목 'B', 수량 : 5}, {위치 'A6'항목 'C', 수량 : 245}, {위치 'A9'항목 'D', 수량 : 15}, {위치 'B1'항목 'E', 수량 : 65}, {위치 'SHOP'항목 'F', 수량 : 42}, {위치 'A7'항목 'G', 수량 : 57}, {위치 'A3'항목 'H', 수량 : 324}, {위치 'B5'항목 'I', 수량 : 4}, {위치 'A5'항목 'J', 수량 : 58}, {위치 'B2'항목 'K', 수량 : 45}, {위치 'A10'항목 'L', 수량 : 29}, {위치 : 'A4', 항목 : 'M', 수량 : 11}, {위치 'B4'항목 'N', 수량 : 47}, {위치 'A1'항목 'O', 수량 : 55}, {위치 'A8'항목 'P', 수량 : 842}, {위치 'A2'항목 'Q', 수량 : 67} ]; CONST sortArray = (sourceArray) => { CONST sortByLocation = (a, b) => a.location.localeCompare (b.location 'EN'{숫자 : TRUE}); // 공지 사항 나는 점 표기법을 사용 ^^ 여기 여기 위치 ^^과를 지정 창 sourceArray.sort (sortByLocation); }; ( '분류되지 않은 :'에서 myArray)을 console.log; CONSOLE.LOG가 ( '위치로 정렬', sortArray (myArray의));

    당신은 쉽게 정렬 다른 키 중 하나에 의해뿐만 아니라 수 있습니다. 스 니핏에 도시 된 바와 같이,이 경우, 항목 또는 양 도트 표기법.


  11. 11.나는 스크립트 아래에 위의 정렬 문제를 해결 한

    나는 스크립트 아래에 위의 정렬 문제를 해결 한

    arrVals.sort(function(a, b){
        //return b.text - a.text;
        var AInt = parseInt(a.text, 10);
        var BInt = parseInt(b.text, 10);
    
        if ($.isNumeric(a.text) == false && $.isNumeric(b.text) == false) {
            var aA = a.text
            var bA = b.text;
            return aA > bA ? 1 : -1;
        } else if ($.isNumeric(a.text) == false) {  // A is not an Int
            return 1;    // to make alphanumeric sort first return -1 here
        } else if ($.isNumeric(b.text) == false) {  // B is not an Int
            return -1;   // to make alphanumeric sort first return 1 here
        } else {
            return AInt < BInt ? 1 : -1;
        }
    });
    

    이것은 잘 혼합 배열에 대해 잘 작동합니다. :)

    감사합니다.


  12. 12.

    alphaNumericCompare(a, b) {
    
        let ax = [], bx = [];
    
        a.replace(/(\d+)|(\D+)/g, function (_, $1, $2) { ax.push([$1 || Infinity, $2 || '']) });
        b.replace(/(\d+)|(\D+)/g, function (_, $1, $2) { bx.push([$1 || Infinity, $2 || '']) });
    
        while (ax.length && bx.length) {
           let an = ax.shift();
           let bn = bx.shift();
           let nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
           if (nn) {
             return nn;
           }
         }
         return ax.length - bx.length;
    }
    

  13. 13.다음은이 답변에 ES6 타이프 라이터 업그레이드입니다.

    다음은이 답변에 ES6 타이프 라이터 업그레이드입니다.

    export function SortAlphaNum(a: string, b: string) {
    const reA = /[^a-zA-Z]/g;
    const reN = /[^0-9]/g;
    const aA = a.replace(reA, "");
    const bA = b.replace(reA, "");
    if (aA === bA) {
        const aN = parseInt(a.replace(reN, ""), 10);
        const bN = parseInt(b.replace(reN, ""), 10);
        return aN === bN ? 0 : aN > bN ? 1 : -1;
    } else {
        return aA > bA ? 1 : -1;
    }
    

    }


  14. 14.이것은 나를 위해 일했다 그리고 좀 더 콤팩트.

    이것은 나를 위해 일했다 그리고 좀 더 콤팩트.

    const reg = /[0-9]+/g;
    
    array.sort((a, b) => {
         let v0 = a.replace(reg, v => v.padStart(10, '0'));
         let v1 = b.replace(reg, v => v.padStart(10, '0'));
         return v0.localeCompare(v1);
    });
    

  15. 15.다음은 라이브러리 함수로 타이프에 (@SunnyPenguin & @code 미치광이의 답변에 따라) 버전입니다. 변수 이름은 업데이트 및 의견은 명확성을 위해 추가.

    다음은 라이브러리 함수로 타이프에 (@SunnyPenguin & @code 미치광이의 답변에 따라) 버전입니다. 변수 이름은 업데이트 및 의견은 명확성을 위해 추가.

    // Sorts strings with numbers by keeping the numbers in ascending order
    export const sortAlphaNum: Function = (a: string, b: string, locale: string): number => {
      const letters: RegExp = /[^a-zA-Z]/g;
      const lettersOfA: string = a.replace(letters, '');
      const lettersOfB: string = b.replace(letters, '');
    
      if (lettersOfA === lettersOfB) {
        const numbers: RegExp = /[^0-9]/g;
        const numbersOfA: number = parseInt(a.replace(numbers, ''), 10);
        const numbersOfB: number = parseInt(b.replace(numbers, ''), 10);
    
        if (isNaN(numbersOfA) || isNaN(numbersOfB)) {
          // One is not a number - comparing letters only
          return new Intl.Collator(locale, { sensitivity: 'accent' }).compare(a, b);
        }
        // Both have numbers - compare the numerical parts
        return numbersOfA === numbersOfB ? 0 : numbersOfA > numbersOfB ? 1 : -1;
      } else {
        // Letter parts are different - comparing letters only
        return new Intl.Collator(locale, { sensitivity: 'accent' }).compare(lettersOfA, lettersOfB);
      }
    };
    

  16. 16.

    function sortAlphaNum(a, b) {
        var smlla = a.toLowerCase();
        var smllb = b.toLowerCase();
        var result = smlla > smllb ? 1 : -1;
        return result;
    }
    
  17. from https://stackoverflow.com/questions/4340227/sort-mixed-alpha-numeric-array by cc-by-sa and MIT license