2017-01-25 13 views
1

Я пытаюсь сортировать абзац в алфавитном порядке, а не в соответствии с нормальным ABC, но с готовым (порядок var).ручная сортировка абзаца по выписанному алфавиту с помощью javascript

Я написал эту функцию, и она отлично работает, но только для первой буквы каждого слова, а не для сортировки слов в слово (например, в правильной ABC «банан» придет до «дня рождения»).

Я не уверен, куда идти отсюда.

$("#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(',')); 
}); 

EDIT: Пример входного сигнала может быть: «Привет дан вам не кажется, что это является удивительным», и я хочу выход быть: «не дан привет является удивительным это кажется, что вы".

+0

Просто любопытно, что назначение сортировки ранга каждую букву в алфавите не работает, а затем сортировать по рангу? – Nope

+0

, пожалуйста, добавьте примеры данных и желаемый результат. –

+0

Это должно быть довольно просто реализовать, но нам нужно будет увидеть ваш HTML - или, по крайней мере, входное значение - во-первых, вместе с ожидаемым выходом –

ответ

0

Вы можете использовать объект с индексом букв и использовать Array#sort с обратным вызовом, который ищет каждую букву и вычисляет заказ.

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/

 Смежные вопросы

  • Нет связанных вопросов^_^