Underscore.js案例不敏感排序

时间:2014-09-16 16:11:10

标签: sorting underscore.js case-insensitive

尝试使用underscore.js进行不区分大小写的排序时遇到一些小问题。我有一个对象数组,并希望能够按属性名称进行排序。

使用快捷方式sortBy

  

iteratee也可以是要排序的属性的字符串名称(例如,长度)。

要排序的数组:

var array = [{ name: 'test_1234', description: 'zzaaa bb cc'}, 
         { name: 'zz1111', description: 'ZAAbbbcc'}, 
         { name: 'TEST', description: '4422'}, 
         { name: '1a2929', description: 'abcdef'}, 
         { name: 'abc', description: 'Full description'}, 
         { name: 'GGGGH', description: '123456'}];

使用此方法排序sortProperty ='name',结果在小写之前放置大写。

var sorted = _.sortBy(array, sortProperty);

1a2929 - abcdef
GGGGH - 123456
TEST - 4422
abc - Full description
test_1234 - zzaaa bb cc
zz1111 - ZAAbbbcc

我认为这与区分大小写有关,但我无法弄清楚如何将数组中的名称更改为小写并进行比较。

非常感谢任何帮助。

编辑: 正如所指出的,您传入名称或函数,因此只需调整函数以返回要排序的字段: http://jsfiddle.net/rjaqp1vg/5/

3 个答案:

答案 0 :(得分:67)

要排序的名称可以是字段名称或函数,因此传递一个执行小写转换的函数。

var sorted = _.sortBy(array, function (i) { return i.name.toLowerCase(); });

应该这样做。

答案 1 :(得分:14)

不要使用_.sortBy。按字母顺序排序字符串的正确方法是使用localeCompare。这是纯Javascript中的一个例子:

['Z', 'A','z','á', 'V'].sort(function(a, b){
   return a.localeCompare(b, undefined /* Ignore language */, { sensitivity: 'base' }) 
});

请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

答案 2 :(得分:0)

Chris的回答对我来说效果很好,并且我通过箭头功能使其变得更短了:

var sorted = _.sortBy(array, (i) => i.name.toLowerCase());