2017-01-25 4 views
1

나는 단락을 알파벳 순서로 정렬하려고하는데, 보통 ABC가 아니라 구성 (바코드 순서)으로 정렬하려고합니다.수동으로 자바 스크립트로 구성된 알파벳으로 단락을 정렬

나는이 기능을 썼다. 각 단어의 첫 글자에 대해서만 - 단어 정렬이 아니라 (예를 들어 올바른 ABC 'banana'가 'birthday'이전에 올 것이다.).

여기에서 어디로 가야할지 모르겠습니다.

$("#send").click(function() { 
     var text = $("#text").val().replace(/[^A-Za-z0-9_\s]/g, "").toUpperCase().split(" "); 
     var order = ["Q", "B", "K", "D", "H", "V", "Z", "E", "F", "O", "G", "L", "M", "S", "N", "P", "I", "X", "A", "R", "W", "U", "C", "J", "T", "Y"]; 
     var i, t, j; 
     var newText = []; // will hold the new alphabet 
     // function to sort the words: 
     for (i = 0; i < order.length; i++) { 
      for (t = 0; t < text.length; t++) { 
        var firstChar = text[t][0]; 
        if (order[i] == firstChar) { 
         newText.push(text[t]); 
        } 
      } 
     } 
     console.log(newText.join(',')); 
}); 

편집 : 예 입력 할 수 있습니다 : "안녕 댄이 끝내라고 생각하지 않는다"나는 출력이 원하는 : "하지 댄 안녕이 있다고 생각 끝내 않습니다 당신".

+0

정렬 순위에 의해 다음 작동하지 알파벳의 각 문자에 정렬 순위를 할당하는 것입니다 : 여기에 재귀가 사용하는 솔루션이다? – Nope

+0

몇 가지 샘플 데이터와 원하는 결과를 추가하십시오. –

+0

이것은 구현이 매우 간단해야하지만 예상되는 출력과 함께 HTML (또는 적어도 입력 값)을 먼저 확인해야합니다. –

답변

0

글자의 색인이있는 객체를 사용할 수 있으며 모든 문자를 찾는 콜백에 Array#sort을 사용하면 adn이 순서를 계산합니다.

function foo(text) { 
 
    var text = text.replace(/[^A-Za-z0-9_\s]/g, "").toUpperCase().split(" "), 
 
     order = "QBKDHVZEFOGLMSNPIXARWUCJTY", 
 
     ref = {}; 
 

 
    order.split('').forEach(function (a, i) { ref[a] = i + 1; }); 
 
    text.sort(function (a, b) { 
 
     var i = 0, v; 
 
     do { 
 
      v = (ref[a[i]] || 0) - (ref[b[i]] || 0); 
 
      i++; 
 
     } while (!v) 
 
     return v; 
 
    }); 
 
    console.log(text.join(', ')); 
 
} 
 

 
foo('a aa ab b ba bb'); 
 
foo('banana birthday');

0

알고리즘의 문제는 각 단어의 첫 글자를 비교한다는 것입니다,하지만 문자 알고리즘이 각 단어의 다음 문자를 비교할 필요가 동일합니다. 그냥 궁금

function doSort(inputArr) { 

    var words = inputArr.slice(0); 

    var alphabet = ["Q", "B", "K", "D", "H", "V", "Z", "E", "F", "O", "G", "L", "M", "S", "N", "P", "I", "X", "A", "R", "W", "U", "C", "J", "T", "Y"]; 

    words.sort(function(item1, item2) { 
    return sortRecursive(item1, item2, 0); 
    }); 

    function sortRecursive(item1, item2, idx) { 

    if (item1.length <= idx && item2.length <= idx) { 
     return 0; 
    } else if (item1.length <= idx) { 
     return -1; 
    } else if (item2.length <= idx) { 
     return 1; 
    } else if (item1[idx] == item2[idx]) { 
     return sortRecursive(item1, item2, idx+1); 
    } else { 
     return alphabet.indexOf(item1[idx].toUpperCase()) - alphabet.indexOf(item2[idx].toUpperCase()); 
    } 
    } 

    return words; 
} 

var arr = ["banana", "quebec", "bird", "birthday", "birdman", "bird"]; 
var sortedArr = doSort(arr); 

console.log('unsorted',arr); 
console.log('sorted', sortedArr); 

https://jsfiddle.net/2qgaaozo/