2016-07-12 1 views
2

Я разрабатываю приложение с использованием Reactjs и underscore.js. Я пытаюсь сортировать список, используя имя, которое является строкой. Однако имена содержат номера, в результате сортировка не правильная. Вот пример моего кода и его результат:Сортировка массива объектов с использованием имени, содержащего алфавит и числа с использованием

items= _.sortBy(items, function (item) { 
    return item.name.toLowerCase() 
}); 

Результат:

S1.2M (FA) 
S10.1M 
S10.2M 
S10.4M 
S11 (GR14) 
S2 (DT) 
S3.1M (GR17) 

, но я хочу результат, чтобы быть похожим на это:

S1.2M (FA) 
S2 (DT) 
S3.1M (GR17) 
S10.1M 
S10.2M 
S10.4M 
S11 (GR14) 

, как можно достичь этого ?

ответ

2

Короткий ответ: Термин, который вы ищете, является «Природный Сортировка», и это не то, чего вы легко можете достичь в 1 строке.

Подчеркивание делает его еще сложнее, потому что оно не предоставляет вам 2 элемента для сравнения, а всего лишь 1, чтобы обеспечить измерение для сравнения.

Вы можете найти множество примеров:

Javascript : natural sort of alphanumerical strings

и

Underscore.js sort an array of objects alphanumerically

Ближайший вы можете достичь с underscorejs что-то вроде:

_.sortBy(items, function (a) { 
    return parseInt(a.match(/\d+/)[0]); 
}); 

, который просто сравнивает первое число (не цифру) в строке.

+0

Спасибо, я закончил использование решений в Javascript: натуральный вид буквенно-цифровых строк. – user261002

2

Это может быть сделано с помощью sortBy() дважды.

var items = [ 
 
      {"name":"S1.2M (FA)"}, 
 
      {"name":"S10.1M"}, 
 
      {"name":"S10.2M"}, 
 
      {"name":"S10.4M"}, 
 
      {"name":"S11 (GR14)"}, 
 
      {"name":"S2 (DT)"}, 
 
      {"name":"S3.1M (GR17)"} 
 
     ] 
 
     
 
     //sort by alphabetical order 
 
     items = _.sortBy(items, function (item) { 
 
      return item.name.toLowerCase() 
 
     }) 
 

 
     //sort while ignoring first character 
 
     items = _.sortBy(items, function(item) { 
 
     \t return item.name.substring(1); 
 
     }); 
 

 

 
_.each(items, function(item) { 
 
    $('ul').append('<li>'+item.name+'</li>') 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdn.jsdelivr.net/underscorejs/1.8.3/underscore-min.js"></script> 
 

 
<ul></ul>

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

+1

Приятный трюк, но он не работает по двум причинам. Во-первых, сортировка по подстроке (1) по-прежнему является алфавитной, а не числовой. Во-вторых, окончательный вид полностью отменяет порядок, за исключением равных элементов. Относительный порядок в группе равных элементов сохраняется из предыдущего сорта. Окончательный вид должен быть по первой букве и иметь, например, S сортируется по номеру, который вы должны сортировать по числовой части _beforehand_. Важно сортировать по _just_ первую букву в конечном сортировке, чтобы все S считались равными и сохраняли относительный порядок. – tom