2016-07-12 168 views
2

我正在使用Reactjs和underscore.js開發應用程序。我正在嘗試使用字符串的名稱對列表進行排序。但是,名稱包含數字,因此排序不正確。這裏是我的代碼和它的結果的一個例子:使用名稱propery對包含字母和數字的對象進行排序

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

簡短回答: 您正在尋找的術語是'自然分類',它不是你可以在一行中輕鬆實現的。

下劃線使得它更難,因爲它不提供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_排序。重要的是按最終排序的第一個字母排序,這樣所有的S將被視爲相等,並保留其相對順序。 – tom

相關問題