jqp*_*jqp 5 javascript sorting
我有一个Javascript对象数组,我想通过一个属性进行交叉兼容排序,该属性总是一个正整数,最后有一个可选的单个字母.我正在寻找一种至少适用于Firefox 3和Internet Explorer 8的解决方案.我最接近这样的排序功能如下:
var arrayOfObjects = [{id: '1A', name: 'bar', size: 'big'}, {id: '1C', name: 'bar', size: 'small'}, {id: '1', name: 'foo', size: 'big'}, {id: '1F', name: 'bar', size: 'big'}, {id: '1E', name: 'bar', size: 'big'}, {id: '1B', name: 'bar', size: 'small'}, {id: '1D', name: 'bar', size: 'big'}, {id: '1G', name: 'foo', size: 'small'}, {id: '3', name: 'foo', size: 'small'}, {id: '23', name: 'foo', size: 'small'}, {id: '2', name: 'foo', size: 'small'}, {id: '1010', name: 'foo', size: 'small'}, {id: '23C', name: 'foo', size: 'small'}, {id: '15', name: 'foo', size: 'small'}]
arrayOfObjects.sort(function(a, b){
return (a.id < b.id ? -1 : a.id == b.id ? 0 : 1);
});
Run Code Online (Sandbox Code Playgroud)
排序后,打印出arrayOfObjects给出:
1,foo,big
1010,foo,small
15,foo,small
1A,bar,big
1B,bar,small
1C,bar,small
1D,bar,big
1E,bar,big
1F,bar,big
1G,foo,small
2,foo,小
23,foo,小
23C,foo,小
3,foo,小
但是,我希望arrayOfObjects按以下顺序打印出来:
1,foo,大
1A,酒吧,大
1B,酒吧,小
1C,酒吧,小
1D,酒吧,大
1E,酒吧,大
1F,酒吧,大
1G,foo,小
2,foo,小
3,foo,小
15,foo,小
23,foo,小
23C,foo,小
1010,foo,小
鉴于此,我如何修复上述功能,以便对象按编号排序为主键,字母为辅助键?在此先感谢您的帮助.
arrayOfObjects.sort((function() {
var splitter = /^(\d+)([A-Z]*)/;
return function(a, b) {
a = a.id.match(splitter); b = b.id.match(splitter);
var anum = parseInt(a[1], 10), bnum = parseInt(b[1], 10);
if (anum === bnum)
return a[2] < b[2] ? -1 : a[2] > b[2] ? 1 : 0;
return anum - bnum;
}
})());
Run Code Online (Sandbox Code Playgroud)
这个想法是将键分为数字和字符串部分。
编辑(哎呀,向后调用了“match”)
再次编辑@Ryan Tenney 明智地建议匿名外部函数并不是真正必要的:
arrayOfObjects.sort(function(a, b) {
var splitter = /^(\d+)([A-Z]*)/;
a = a.id.match(splitter); b = b.id.match(splitter);
var anum = parseInt(a[1], 10), bnum = parseInt(b[1], 10);
if (anum === bnum)
return a[2] < b[2] ? -1 : a[2] > b[2] ? 1 : 0;
return anum - bnum;
});
Run Code Online (Sandbox Code Playgroud)
简单一点。
| 归档时间: |
|
| 查看次数: |
3824 次 |
| 最近记录: |