AngularJS/Javascript:使用运算符对字符串进行排序
AngularJS/Javascript: Sorting Strings With Operator
我有一个数组需要排序-
var array1 = ["AAA","BB","B+","AA+","CC","AA-","B","A","AA"];
应用过滤器/排序后,我想要类似的东西——
var array1 = ["AAA","AA+","AA","AA-","A","BB","B+","B","CC"];
在这里,字母表的优先级高于运算符,例如在 AAA 之后,应该在 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;
}
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>
更新:更通用一点
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;
}
}
并像这样使用它的功能
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>
您需要定义一个自定义比较函数并将其传递给排序
array.sort(myfunc)
该函数应返回负值、零值或正值,具体取决于参数。下面的示例函数
myfunc = function(a, b){
//alphabet to be compared
a1 = a.replace(/^[A-Z]+/,'');
b1 = b.replace(/^[A-Z]+/,'');
// in cases where alphabet are same , compare the full string.
if(a1==b1 ){
a1 = a;
b1 = b;
}
if ( a1 < b1 ) return -1;
if ( a1 > b1 ) return 1;
return 0;
}
尝试以下自定义函数进行排序:
array1.sort(mySort);
function mySort(a,b){
var A = a;
var B = b;
if (A < B) {
return -1;
}
else if (A > B) {
return 1;
}
else {
return 0;
}
}
https://en.wikipedia.org/wiki/ASCII
在这里回答,
重量:A <+ 和 AAA <AA+>
相关文章:
- Javascript排序字符串或数字
- 根据另一个数组对数组进行排序,包括位置和字符串[ES6]
- 根据Javascript中的字符串值对数组的数组进行排序
- Sencha Ext JS排序标准以字符串而不是JSON的形式发送
- 可以用javascript对包含数字的字符串进行排序
- 如何对字母数字字符串值进行排序
- AngularJS/Javascript:使用运算符对字符串进行排序
- 按字母顺序、数字顺序和特殊字符对字符串数组进行排序
- 通过自定义字母javascript对字符串进行排序
- 按表示节号的字符串排序的下划线
- Javascript字符串排序
- 自定义javascript字符串排序比较器
- 在javascript中按两个或多个子字符串排序字符串数组
- JavaScript -按时间字符串排序
- 字符串排序在算法上是如何工作的
- 按字符串排序Javascript对象数组
- 根据子字符串中的数字对字符串排序
- Javascript货币字符串排序
- Safari浏览器Javascript数组似乎对字符串排序不正确
- 多维数组按字符串排序,而不是按值排序