![](https://img-blog.csdnimg.cn/direct/dfcbc45a386e41c286ac7c1a607de0f5.png)
![](https://img-blog.csdnimg.cn/direct/c60211d3cd54488589ab6c628d0bad55.png)
<el-table-column property="CalcName" label="XX" width="200px" show-overflow-tooltip sortable :sort-method="SortChangeHandler">
<template #default="scope">
<el-input v-model="scope.row.CalcName" clearable size="small"></el-input>
</template>
</el-table-column>
function SortChangeHandler(a, b) {
// 分数转小数
function fractionToDecimal(str) {
if (str.includes('/')) {
const [numerator, denominator] = str.split('/').map(Number)
return numerator / denominator
}
return parseFloat(str)
}
// 提取数字和字符串部分
function extractParts(s) {
if (s === null || s === undefined) {
return []
}
const regex = /([+-]?([0-9]*[.])?[0-9]+\/([0-9]*[.])?[0-9]+)|([+-]?([0-9]*[.])?[0-9]+)|([^\d]+)/g
const matches = s.match(regex)
return matches
? matches.map(part => {
const number = fractionToDecimal(part)
return isNaN(number) ? part : number
})
: []
}
// 对比两个部分
function compareParts(partsA, partsB) {
for (let i = 0; i < Math.min(partsA.length, partsB.length); i++) {
if (partsA[i] !== partsB[i]) {
if (typeof partsA[i] === 'number' && typeof partsB[i] === 'number') {
return partsA[i] - partsB[i]
} else {
return partsA[i].toString().localeCompare(partsB[i].toString(), 'zh', { numeric: true, sensitivity: 'base' })
}
}
}
return partsA.length - partsB.length
}
const partsA = extractParts(a.CalcName)
const partsB = extractParts(b.CalcName)
return compareParts(partsA, partsB)
}