2015-03-17 3 views
1

Сейчас я работаю в javascriptstring сортировки с использованием localeCompare и мои данные будут содержать несколько null значения тоже.Javascript `localeCompare` возвращают разные значения

А при каком-то значении string ибыло обнаружено странное свидание: localeCompare и null. При сравнении строкового значения до начала с a/A to n/N он работает нормально, как показано ниже.

"n".localeCompare(null) // return -1; 
"N".localeCompare(null) // return -1; 

Но после того, как если я сравнить нулевое значение с o/O to z/Z возвращает 1

"o".localeCompare(null) // return 1; 
"O".localeCompare(null) // return 1; 

Я знаю, что localeCompare работы с сравнением Unicode но почему данное поведение происходит там какая-либо причина?

ответ

3

localeCompare сравнивает строки, как таковой ничего переданного ему будет преобразовано в строку, и вы получите тот же результат от

"n".localeCompare("null") // return -1; 
"o".localeCompare("null") // return 1; 

потому

localeCompare() возвращает a номер, указывающий, соответствует ли эталонная строка до или после или такая же, как данная строка Порядок сортировки.

MDN

что означает

"null".localeCompare("null") -> вернет 0, как это та же строка
"n".localeCompare("null") -> вернет -1, как это происходит, прежде чем null "o".localeCompare("null") -> вернет 1 как это приходит после null

+0

Спасибо за ответ. Вы имеете в виду, что 'null' преобразуется в строку при передаче в качестве аргумента в' localeCompare', и поэтому я должен обрабатывать его вне? – Madhu

+0

'localeCompare' ** только ** сравнивает строки, поэтому да что-либо переданное ему будет рассматриваться как строка, а null не является строкой и не может сравниться с' n'. Как вы справляетесь с этим, зависит от того, что вы ожидаете при сравнении строк и «null»? – adeneo

+0

Спасибо, объясняет много, я собираюсь отметить это как ответ. – Madhu

0

Если вы хотите реальный мир компаратора, который может обрабатывать null значения

Тогда вы лучше реализации что-то вроде этого,

function stringComparer(a,b) { 
    if(a && b) 
    return a.localeCompare(b); 
    else 
    // sort null and "" to bottom 
    if(a) 
     return -1; 
    else if(b) 
     return 1; 
    else 
     return 0; 
} 

и использовать его, чтобы сравнить значение. Вот пример,

['Łove','Love',null,"",null,'kellogs','Kellogs','kellogs',null,"Lover"," ",'Man',"abc", "AAb", "Abc"].sort(stringComparer) 

Существует несколько возможностей для повышения этого в зависимости от того, как вы хотите нулевой, «» и «» значения для сортировки по отношению друг к другу. В вышеприведенной реализации «» сортируется до вершины, а значения «null» и «» будут сортироваться в нижней части.

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