巴林闲侠
2 years ago
1 changed files with 212 additions and 0 deletions
@ -0,0 +1,212 @@ |
|||
'use strict'; |
|||
|
|||
export function sort(arr, sortProperty) { |
|||
if (!Array.isArray(arr)) { |
|||
throw new Error('参数必须是数组'); |
|||
} |
|||
|
|||
const map = arr.reduce((p, n) => { |
|||
let sortProperty_ = sortProperty || 'name' |
|||
if (n[sortProperty_]) { |
|||
const sortKey = getOrderableString(n[sortProperty_]).join(''); |
|||
|
|||
if (p[sortKey]) { |
|||
if (Array.isArray(p[sortKey])) { |
|||
p[sortKey].push(n); |
|||
} else { |
|||
p[sortKey] = [p[sortKey], n]; |
|||
} |
|||
} else { |
|||
p[sortKey] = n; |
|||
} |
|||
return p; |
|||
} else { |
|||
throw new Error('排序对象不包含指定属性或name属性'); |
|||
} |
|||
}, {}); |
|||
|
|||
const keys = Object.keys(map); |
|||
|
|||
keys.sort(); |
|||
|
|||
let result = []; |
|||
keys.forEach(key => { |
|||
if (Array.isArray(map[key])) { |
|||
result = result.concat(map[key]); |
|||
} else { |
|||
result.push(map[key]); |
|||
} |
|||
}); |
|||
|
|||
return result; |
|||
} |
|||
|
|||
export function getOrderableString(source) { |
|||
// let result = source.includes('-') ? source.split('-') : source.includes('_') ? source.split('_') : source.split(''); //区分批量添加测点的-
|
|||
|
|||
// result = replaceNumber(result);
|
|||
|
|||
let result; |
|||
if (source.includes('-') || source.includes('_')) { |
|||
result = source.includes('-') ? source.split('-') : source; |
|||
result = Array.isArray(result) ? result.reduce((p, n) => { |
|||
if (!n.includes('_')) return p.concat(n); |
|||
|
|||
return p.concat(n.split('_')) |
|||
}, []) : result.includes('_') ? result.split('_') : result; |
|||
result = result.reduce((p, n) => { |
|||
p = p.concat(replaceNumber(n.split(''))) |
|||
|
|||
return p; |
|||
}, []); |
|||
} else { |
|||
result = replaceNumber(source.split('')) |
|||
} |
|||
|
|||
result = replaceChineseNumber(result); |
|||
|
|||
result = replaceSpecialWord(result); |
|||
|
|||
return result; |
|||
} |
|||
|
|||
function replaceNumber(source) { |
|||
let result = source.concat([]); |
|||
let numFound = false; |
|||
let numStart = 0; |
|||
let baseLine = 0; |
|||
for (let i = 0; i < source.length; i++) { |
|||
let calc = false; |
|||
let len = 0; |
|||
let num = parseInt(source[i]); |
|||
if (!Number.isNaN(num)) { |
|||
if (!numFound) { |
|||
numFound = true; |
|||
numStart = i; |
|||
} |
|||
if (i == source.length - 1) { |
|||
calc = true; |
|||
len = source.length - numStart; |
|||
} |
|||
} |
|||
else { |
|||
if (numFound) { |
|||
numFound = false; |
|||
calc = true; |
|||
len = i - numStart; |
|||
} |
|||
} |
|||
if (calc) { |
|||
if (len < 5) { |
|||
let zeroes = ''; |
|||
for (let j = 0; j < 5 - len; j++) { |
|||
zeroes += "0"; |
|||
} |
|||
|
|||
if (baseLine > 0 && Number(num) < 10) { |
|||
//为解决[3d-12,3d-2]排序结果为[3d-12,3d-2]的问题,添加此处
|
|||
baseLine--; |
|||
} |
|||
result.splice(baseLine + numStart, 0, zeroes); |
|||
baseLine += zeroes.length; |
|||
} |
|||
} |
|||
} |
|||
|
|||
return result.join('').split(''); |
|||
} |
|||
|
|||
function replaceSpecialWord(source) { |
|||
const map = { "上": "1001", "中": "1002", "下": "1003", "左": "1001", "右": "1003" }; |
|||
|
|||
let result = source.join(''); |
|||
Object.keys(map).forEach(key => { |
|||
result = result.replace(key, map[key]); |
|||
}); |
|||
|
|||
return result.split(''); |
|||
} |
|||
|
|||
function replaceChineseNumber(source) { |
|||
var map = |
|||
{ |
|||
"零": 0, |
|||
"一": 1, |
|||
"二": 2, |
|||
"三": 3, |
|||
"四": 4, |
|||
"五": 5, |
|||
"六": 6, |
|||
"七": 7, |
|||
"八": 8, |
|||
"九": 9, |
|||
"十": 10 |
|||
}; |
|||
|
|||
var result = source; |
|||
var numFound = false; |
|||
var numStart = 0; |
|||
var baseLine = 0; |
|||
for (let i = 0; i < source.length; i++) { |
|||
var calc = false; |
|||
var len = 0; |
|||
if (map[source[i]]) {//零不作处理
|
|||
if (!numFound) { |
|||
numFound = true; |
|||
numStart = i; |
|||
} |
|||
if (i == source.length - 1) { |
|||
calc = true; |
|||
len = source.length - numStart; |
|||
} |
|||
} |
|||
else { |
|||
if (numFound) { |
|||
numFound = false; |
|||
calc = true; |
|||
len = i - numStart; |
|||
} |
|||
} |
|||
|
|||
if (calc) { |
|||
var cp = ''; |
|||
var num = -1; |
|||
if (len == 1) { |
|||
num = map[source[numStart]]; |
|||
} |
|||
else if (len == 2) { |
|||
if (source[numStart] == '十') { |
|||
num = 10 + map[source[numStart + 1]]; |
|||
} |
|||
else if (source[numStart + 1] == '十') { |
|||
num = map[source[numStart]] * 10; |
|||
} |
|||
else { |
|||
num = map[source[numStart]] * 10 + map[source[numStart + 1]]; |
|||
} |
|||
} |
|||
else if (len == 3) { |
|||
if (source[numStart + 1] == '十') { |
|||
num = map[source[numStart]] * 10 + map[source[numStart + 2]]; |
|||
} |
|||
else { |
|||
num = map[source[numStart]] * 100 + map[source[numStart + 1]] * 10 + map[source[numStart + 2]]; |
|||
} |
|||
} |
|||
|
|||
if (num != -1) { |
|||
var l = 3 - num.toString().length; |
|||
var zeroes = ''; |
|||
for (let j = 0; j < l; j++) { |
|||
zeroes += "0"; |
|||
} |
|||
cp = zeroes + num; |
|||
|
|||
result.splice(baseLine + numStart, len, cp); |
|||
baseLine += cp.length - len; |
|||
} |
|||
} |
|||
} |
|||
|
|||
return result.join('').split(''); |
|||
} |
Loading…
Reference in new issue