2
[
 {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"}
]

如何order在 underscore.js 的帮助下(或不使用)对这个列表进行排序。所以我最终会得到这个:

[
 {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 

所以解决方案必须尽可能通用。

4

2 回答 2

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。

于 2013-10-16T14:26:28.500 回答
0

看看这个:如何使用 js 比较软件版本号?(只有数字)

您当然必须用“。”来拆分 order 变量。

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

那时你有一个新问题,它只是按多个值排序。我认为您可能会按每个订单数组的第 0 个值分组,然后按下一个排序。

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

于 2013-10-16T14:26:04.700 回答