[
{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
所以解决方案必须是通用的。
答案 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个值进行分组,然后按下一个排序。
最终你可能会得到一个递归的解决方案......我会开始考虑在这里进行编辑。