2016-07-12 115 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

相关问题