fix Ox.sort so that it handles multiple numbers

This commit is contained in:
rlx 2012-04-24 10:47:18 +00:00
parent b4fd0f01ae
commit 959a014657

View file

@ -411,22 +411,21 @@ Ox.range = function() {
function getSortValues(arr, fn) { function getSortValues(arr, fn) {
var arr_ = fn ? arr.map(fn) : arr, var arr_ = fn ? arr.map(fn) : arr,
len, matches = {}, sort = {}; len, matches = [], sort = {};
// find numbers // find numbers
arr.forEach(function(val, i) { arr.forEach(function(val, i) {
var match; var match;
if (Ox.isString(val)) { if (Ox.isString(val)) {
match = /\d+/.exec(arr_[i]); match = arr_[i].match(/\d+/g);
matches[val] = match ? match[0] : ''; match && Ox.merge(matches, match);
} }
}); });
// get length of longest number // get length of longest number
len = Ox.max(Ox.map(matches, function(val) { len = Ox.max(Ox.map(matches, function(val) {
return val.length; return val.length;
})); }));
// pad numbers, make lowercase, // make lowercase, remove leading non-word characters,
// remove leading non-word characters // pad numbers and move leading articles to the end
// and move leading articles to the end
arr.forEach(function(val, i) { arr.forEach(function(val, i) {
var val_ = arr_[i]; var val_ = arr_[i];
if ( if (
@ -436,16 +435,14 @@ Ox.range = function() {
) { ) {
sort[val] = null; sort[val] = null;
} else if (Ox.isString(val_)) { } else if (Ox.isString(val_)) {
sort[val] = ( sort[val] = val_.toLowerCase()
matches[val] .replace(/^\W+/, '')
? val_.replace( .replace(/\d+/g, function(match) {
matches[val], Ox.pad(matches[val], len) return Ox.pad(match, len);
) });
: val_
).toLowerCase().replace(/^\W+/, '');
Ox.forEach(['a', 'an', 'the'], function(article) { Ox.forEach(['a', 'an', 'the'], function(article) {
var len; var len;
if (new RegExp('^' + article + ' ', 'i').test(sort[val])) { if (new RegExp('^' + article + ' ').test(sort[val])) {
len = article.length; len = article.length;
sort[val] = sort[val].substr(len + 1) + ', ' sort[val] = sort[val].substr(len + 1) + ', '
+ sort[val].substr(0, len); + sort[val].substr(0, len);