您好,我遇到了問題。
我想按十進制和字母順序排列我的表。
例如,我得到了這個:
5.3 Choice 3
A-Choice 4
1.2 Choice 1
1.5 Choice 2
C-Choice 5
我希望它是這樣的:
1.2 Choice 1
1.5 Choice 2
5.3 Choice 3
A-Choice 4
C-Choice 5
我試過這樣的事情
const compare = (a, b) => {
if (!isNaN(b.label.charAt(0)))
{
if (a.label === b.label) {
return 0
};
const aArr = a.label.split("."), bArr = b.label.split(".");
for (let i = 0; i < Math.min(aArr.length, bArr.length); i ) {
if (parseInt(aArr[i]) < parseInt(bArr[i])) {
return -1
};
if (parseInt(aArr[i]) > parseInt(bArr[i])) {
return 1
};
}
if (aArr.length < bArr.length) {
return -1
};
if (aArr.length > bArr.length) {
return 1
};
return 0;
}
else
{
return a.label > b.label;
}
};
processus.sort(compare);
但它不起作用..謝謝。
uj5u.com熱心網友回復:
這可以通過localeCompare輕松實作。
const arr = [
'5.3 Choice 3',
'A-Choice 4',
'1.2 Choice 1',
'1.5 Choice 2',
'C-Choice 5',
];
const result = arr.sort((a, b) => a.localeCompare(b));
console.log(result);
uj5u.com熱心網友回復:
嘗試使用字串比較 (ic localeCompare)進行排序。
localeCompare如果 'Choice' 之后的值可能 > 9(例如'1.2 Choice 23'. 在這種情況下,您需要排序兩次,例如代碼段。
const toSort = getToSort();
log(`\n**Choice always [< 10], localeCompare sufficient`,
toSort.simple
.sort((a, b) => a.localeCompare(b))
.join(`\n`)
);
// this does not work for a choice values > 9
log(`\n**Choice may be [> 9], localeCompare insufficient`,
toSort.complex
.sort((a, b) => a.localeCompare(b))
.join(`\n`)
);
// so, [Choice > 9] needs more work
// The plan:
// 1. Sort on string start (e.g. '1.2', 'C'), create
// an Object from that with key = string start,
// values = [next values] and convert it to an
// Array of entries;
// 2. Sort numeric within the entries Array on the
// last value ('Choice [value]'), which is already
// converted to number. Remap the result to sorted
// strings.
const linesSorted = Object.entries(toSort.complex /*1*/
.map(v => v.split(/[\s-]/))
.sort(([a, , ], [b, , ]) => a.localeCompare(b))
.reduce( (acc, [v1, v2, v3]) =>
({ ...acc, [v1]: [...(acc[v1] || []), [v2, v3]]}), {} ) )
.reduce( (acc, [key, value]) => /*2*/
[...acc, [key,
value.sort(([, a], [, b]) => a - b, [] ).map(v =>
`${key} ${v.join(` `)}`)]], [])
.map(([, value]) => value.join(`\n`))
.join(`\n`);
log(`\n**Choice may be [> 9], need more work`, linesSorted);
// helpers
function getToSort() {
// return strings to sort, already splitted to array
return {
simple: `5.3 Choice 3
A-Choice 4
1.2 Choice 1
1.5 Choice 2
C-Choice 5`.split(`\n`).map(v => v.trim()),
complex: `1.5 Choice 3
5.3 Choice 3
1.2 Choice 55
A-Choice 4
1.2 Choice 1
1.5 Choice 11
C-Choice 5
A-Choice 110
1.2 Choice 2`.split(`\n`).map(v => v.trim())
};
}
function log(...strs) {
const pre = document.querySelector(`pre`);
strs.forEach(str => pre.textContent = `${str}\n`);
}
<pre></pre>
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/323880.html
標籤:javascript 数组 排序
