下划线按字符串排序,表示节号

时间:2013-10-16 14:20:39

标签: javascript sorting underscore.js

[
 {name:"foo", value:"1", order:"1.1.12"},
 {name:"foo bar", value:"2", order:"2.10.1"},
 {name:"bar", value:"3", order:"1.11.5"},
 {name:"baz", value:"4", order:"2.6.2"},
 {name:"foo baz", value:"5", order:"1.3.10"}
]

如何在{coreer.js(或没有)的帮助下按order对此列表进行排序。 所以我最终会这样:

[
 {name:"a", value:"1", order:"1.1.12"},
 {name:"a", value:"5", order:"1.3.10"},
 {name:"a", value:"3", order:"1.11.5"},
 {name:"a", value:"4", order:"2.6.2"},
 {name:"a", value:"2", order:"2.10.1"}  
]

值得一提的是order可以是任何数字长,例如它可能是:

1.1
2
3.1.2.3 

所以解决方案必须是通用的。

2 个答案:

答案 0 :(得分:3)

您可以将字符串拆分为数字数组并比较相同位置的数字,直到找到不同的数字:

var arr = [
 {name:"foo", value:"1", order:"1.1.12"},
 {name:"foo bar", value:"2", order:"2.10.1"},
 {name:"bar", value:"3", order:"1.11.5"},
 {name:"baz", value:"4", order:"2.6.2"},
 {name:"foo baz", value:"5", order:"1.3.10"},  
 {name:"foo baz", value:"5", order:"1.3"},   
 {name:"foo baz", value:"5", order:"2"}
];


arr.sort(function(item1, item2){
  var split1 = item1.order.split('.');
  var split2 = item2.order.split('.');
  var length = Math.min(split1.length, split2.length);
  for (var i=0; i<length; i++){
    if (+split1[i] < +split2[i])
      return -1;
    if (+split1[i] > +split2[i])
      return 1;
  }
  return split1.length - split2.length;

});

console.log(arr);

PS:纯JS解决方案,不使用Underscore。

答案 1 :(得分:0)

检查出来:How to compare software version number using js? (only number)

您肯定必须将订单变量拆分为“。”

_.map([...],function(item) { item = item.split('.'); return item;});

此时您遇到了一个新问题,即只按多个值排序。我想你可能按每个订单数组的第0个值进行分组,然后按下一个排序。

最终你可能会得到一个递归的解决方案......我会开始考虑在这里进行编辑。