2015-11-26 1 views
0

Новых в позвоночник, я пытаюсь отсортировать коллекцию в алфавитной, и делает это с одной моделью прошла в как ниже работает отлично:Передача 2 модели по сравнению с одной модели на магистральный компаратор и делать буквенно-цифровую сортировку

comparator: function(model) { 
    return model.get('id').replace(/[^0-9^\.]/g,"")|0; 
} 

Здесь мой предыдущий вопрос и разрешение: Sort a collection alphanumerically in backbone

Теперь, если я что-то вроде, чтобы получить в сравнении локали:

comparator: function(model1, model2) { 
    if ((model1.get('id').localeCompare(model2.get('id'))) < 0) 
     return -1; 
    } 
    if ((model1.get('id').localeCompare(model2.get('id'))) >0) { 
     return 1; 
    } 
    return 0; 
} 

Это отлично подходит для ввода: «id-1, id-0, id-2, id-199» для сортировки как «id-0, id-1, id-2, id-199»

Но делает не сортировать численно здесь: «id-1, id-0, id-2, id-199, id-99» как «id-0, id-1, id-2, id-199, id-99» - id-99 должен быть до id-199. Очевидно, потому что численное сравнение не включено. Я не смог успешно реализовать это, любые идеи?

+1

Это недопустимый код javascript.parentheses не используются должным образом.it должен быть 'if (model1.get ('id'). LocaleCompare (model2.get ('id')) <0)', а последний if предложение имеет ту же проблему. – suish

+0

@suish - мои извинения, я написал код и полагался на свои способности, чтобы сопоставить круглые скобки почти в полночь. Я думаю, что сейчас исправил это. – adelphia

ответ

1

localeCompare просто сравнивайте каждый символ по одному. поэтому он не распознает числовую часть как число, а отдельные одиночные числа, например 1,9,9. , поэтому вам нужно написать собственный компаратор для части номера.

попробовать этот код удар (я даже не проверял код, чтобы он мог иметь опечатку или ошибку синтаксиса)

comparator: function(model1, model2) { 
    var m1num = model1.get("id").replace(/[^0-9^\.]/g,"")|0 || 0 
    var m1str = model1.get("id").replace(m1num,"") 
    var m2num = model2.get("id").replace(/[^0-9^\.]/g,"")|0 || 0 
    var m2str = model2.get("id").replace(m2num,"") 
    switch(true){ 
    case m1str.localeCompare(m2str) < 0: 
     return -1; 
    case m1str.localeCompare(m2str) > 0: 
     return 1; 
    case m1str.localeCompare(m2str) == 0: 
     if(m1num < m2num) return 1 
     else if(m1num > m2num) return -1 
     else return 0 
    } 
} 

FYI, этот код выше не работает должным образом, если ваши модели идентификаторами являются чем-то вроде «i8d-99» и «i7d-200». потому что функция в конечном итоге сравнивается с 899 и 7200. Но кроме этого, она должна работать так, как вы ожидаете

+0

спасибо, это имеет смысл, когда я его прочитал. Я тоже пришел к аналогичному выводу, прочитав некоторые сообщения. Проверьте функцию SortCustom последнего сообщения по адресу http://stackoverflow.com/questions/9431171/correctly-implement-backbone-comparators Я попробую это. – adelphia

0

Как указано @suish, решение на этих линиях (с некоторыми незначительными исправлениями, которые я должен был сделать):

comparator: function(model1, model2) { 
    var m1num = model1.get("id").replace(/[^0-9^\.]/g,"")|0 || 0 
    var m1str = model1.get("id").replace(/[0-9]/g,"") 
    var m2num = model2.get("id").replace(/[^0-9^\.]/g,"")|0 || 0 
    var m2str = model2.get("id").replace(/[0-9]/g,"") 
    switch(true){ 
    case m1str.localeCompare(m2str) < 0: 
     return -1; 
    case m1str.localeCompare(m2str) > 0: 
     return 1; 
    case m1str.localeCompare(m2str) == 0: 
     if(m1num < m2num) return -1 
     else if(m1num > m2num) return 1 
     else return 0 
    } 
} 
Смежные вопросы