ui/lib/shared/addon/utils/sort.js

68 lines
1.4 KiB
JavaScript

import { isArray } from '@ember/array';
import { get } from '@ember/object';
import { compare as compareVersion } from 'shared/utils/parse-version';
const LOCALE_SAFE = /^[\w-.\s,]*$/;
function lcStr(x) {
if ( typeof x === 'string' ) {
return x.toLowerCase();
} else {
return String(x).toLowerCase();
}
}
export function insensitiveCompare(a, b) {
if ( typeof a === 'string' || typeof b === 'string' ) {
a = lcStr(a);
b = lcStr(b);
} else {
return (a > b ? 1 : (a < b ? -1 : 0));
}
if ( LOCALE_SAFE.test(a + b) ) {
return (a > b ? 1 : (a < b ? -1 : 0));
} else {
return a.localeCompare(b, { sensitivity: 'base' });
}
}
export function sortInsensitiveBy(ary, ...fields) {
// sortInsensitiveBy(ary, field1, field2) or sortInsensitiveBy(ary, [field1, field2])
if ( fields.length === 1 && isArray(fields[0]) ) {
fields = fields[0];
}
return ary.sort((a, b) => {
let out = 0;
for ( var i = 0 ; i < fields.length ; i++ ) {
let aa = get(a, fields[i]);
let bb = get(b, fields[i]);
out = insensitiveCompare(aa, bb);
if ( out !== 0 ) {
break;
}
}
return out;
});
}
export function sortVersions(ary, key) {
let aa, bb;
return ary.sort((a, b) => {
if ( key ) {
aa = get(a, key);
bb = get(b, key);
} else {
aa = a;
bb = b;
}
return compareVersion(aa, bb);
});
}