|
As say above you need pass custom compare function to sort. Something like this
function s(a,b){
function normalize(str){
return str.concat(new Array(4-str.length).join(';')).replace(/[A-Z+-]/g, function($1){
return replacer[$1] ? replacer[$1] : $1;
});
}
var replacer = {
'A' : '1',
'B' : '2',
'C' : '3',
'+' : ':',
'-' : '<'
},
ar = normalize(a),
br = normalize(b);
return ar > br ? 1
: ar < br ? -1
: 0;
}
var array1 = ["AAA","BB","B+","AA+","CC","AA-","B","A","AA"];
function s(a,b){
function normalize(str){
return str.concat(new Array(4-str.length).join(';')).replace(/[A-Z+-]/g, function($1){
return replacer[$1] ? replacer[$1] : $1;
});
}
var replacer = {
'A' : '1',
'B' : '2',
'C' : '3',
'+' : ':',
'-' : '<'
},
ar = normalize(a),
br = normalize(b);
return ar > br ? 1
: ar < br ? -1
: 0;
}
document.getElementById('before').innerHTML = 'unsorted: ' + array1.join();
array1.sort(s);
document.getElementById('result').innerHTML = 'sorted: ' + array1.join();
<span id="before"></span><br>
<span id="result"></span>
UPDATE: a bit more generic
function sorting(maxLen) {
return function s(a, b) {
function checkLength(str, maxlen) {
if (str.length > maxlen) {
throw new Error('string: "' + str + '" (' + str.length + ') too long, max len: ' + maxlen);
}
}
function normalize(str, maxlen) {
return str.concat(new Array(maxlen + 1 - str.length).join(';')).replace(/[A-Z+-]/g, function($1) {
return replacer[$1] ? replacer[$1] : $1;
});
}
checkLength(a, maxLen);
checkLength(b, maxLen);
var replacer = {
'A': '1',
'B': '2',
'C': '3',
'+': ':',
'-': '<'
},
ar = normalize(a, maxLen),
br = normalize(b, maxLen);
return ar > br ? 1 : ar < br ? -1 : 0;
}
}
and use it function like
array1.sort(sorting(array1.reduce(function(a,b){return Math.max(a, b.length);},0)))
var array1 = ["AAAA", "BB", "BBBB+", "AAA+", "CC", "AA-", "BBBB", "A", "AA"];
var array2 = ["AAAA", "BB", "BBBBB+", "AAA+", "CC", "AA-", "BBBB", "A", "AA"];
function sorting(maxLen) {
return function s(a, b) {
function checkLength(str, maxlen) {
if (str.length > maxlen) {
throw new Error('string: "' + str + '" (' + str.length + ') too long, max len: ' + maxlen);
}
}
function normalize(str, maxlen) {
return str.concat(new Array(maxlen + 1 - str.length).join(';')).replace(/[A-Z+-]/g, function($1) {
return replacer[$1] ? replacer[$1] : $1;
});
}
checkLength(a, maxLen);
checkLength(b, maxLen);
var replacer = {
'A': '1',
'B': '2',
'C': '3',
'+': ':',
'-': '<'
},
ar = normalize(a, maxLen),
br = normalize(b, maxLen);
return ar > br ? 1 : ar < br ? -1 : 0;
}
}
function test(witherror, arr, maxlen) {
document.getElementById(witherror + 'before').innerHTML = 'unsorted: ' + arr.join();
try {
arr.sort(sorting(maxlen||arr.reduce(function(a,b){return Math.max(a, b.length);},0)));
document.getElementById(witherror + 'result').innerHTML = 'sorted: ' + arr.join();
} catch (e) {
document.getElementById(witherror + 'result').innerHTML = e;
}
}
test('', array1,5);
test('e', array2,5);
test('a', array2);
<span>sample with error, string is too long</span>
<br>
<span id="ebefore"></span>
<br>
<span id="eresult"></span>
<hr>
<span>sample without error, maxlen = 5</span>
<br>
<span id="before"></span>
<br>
<span id="result"></span>
<hr>
<span>sample without error</span>
<br>
<span id="abefore"></span>
<br>
<span id="aresult"></span>
|
"AAB"
or"BC+"
? – Grundy Mar 11 at 8:19