IE8中的Javascript:如何通过字母数字属性对对象数组进行排序

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,小

鉴于此,我如何修复上述功能,以便对象按编号排序为主键,字母为辅助键?在此先感谢您的帮助.

Poi*_*nty 3

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)

简单一点。