혼합 영숫자 배열 정렬
알파벳 순으로 정렬한 다음 숫자 순으로 정렬해야 하는 혼합 배열이 있습니다.
[A1, A10, A11, A12, A2, A3, A4, B10, B2, F1, F12, F3]
어떻게 분류하면 좋을까요?
[A1, A2, A3, A4, A10, A11, A12, B2, B10, F1, F3, F12]
난 시도했다.
arr.sort(function(a,b) {return a - b});
알파벳 순으로 정렬할 뿐입니다스트레이트 자바스크립트나 jQuery로 할 수 있습니까?
const sortAlphaNum = (a, b) => a.localeCompare(b, 'en', { numeric: true })
용도:
const sortAlphaNum = (a, b) => a.localeCompare(b, 'en', { numeric: true })
console.log(['A1', 'A10', 'A11', 'A12', 'A2', 'A3', 'A4', 'B10', 'B2', 'F1', 'F12', 'F3'].sort(sortAlphaNum))
제공:
["A1", "A2", "A3", "A4", "A10", "A11", "A12", "B2", "B10", "F1", "F3", "F12"]
변경해야 할 수도 있습니다.'en'
사용자 로케일에 대한 인수 또는 프로그래밍 방식으로 결정하지만 영어 문자열에 대해서는 작동합니다.
localeCompare
는 IE11, Chrome, Firefox, Edge 및 Safari 10에서 지원됩니다.
var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
function sortAlphaNum(a, b) {
var aA = a.replace(reA, "");
var bA = b.replace(reA, "");
if (aA === bA) {
var aN = parseInt(a.replace(reN, ""), 10);
var bN = parseInt(b.replace(reN, ""), 10);
return aN === bN ? 0 : aN > bN ? 1 : -1;
} else {
return aA > bA ? 1 : -1;
}
}
console.log(
["A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"].sort(sortAlphaNum)
)
저도 비슷한 상황이었지만, 영숫자와 숫자가 섞여 있어서 모든 숫자를 먼저 정렬한 다음 영숫자를 정렬해야 했습니다.
A10
1
5
A9
2
B3
A2
다음이 되어야 함:
1
2
5
A2
A9
A10
B3
제공된 알고리즘을 사용하여 이를 달성하기 위해 조금 더 해킹할 수 있었습니다.
var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
function sortAlphaNum(a,b) {
var AInt = parseInt(a, 10);
var BInt = parseInt(b, 10);
if(isNaN(AInt) && isNaN(BInt)){
var aA = a.replace(reA, "");
var bA = b.replace(reA, "");
if(aA === bA) {
var aN = parseInt(a.replace(reN, ""), 10);
var bN = parseInt(b.replace(reN, ""), 10);
return aN === bN ? 0 : aN > bN ? 1 : -1;
} else {
return aA > bA ? 1 : -1;
}
}else if(isNaN(AInt)){//A is not an Int
return 1;//to make alphanumeric sort first return -1 here
}else if(isNaN(BInt)){//B is not an Int
return -1;//to make alphanumeric sort first return 1 here
}else{
return AInt > BInt ? 1 : -1;
}
}
var newlist = ["A1", 1, "A10", "A11", "A12", 5, 3, 10, 2, "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"].sort(sortAlphaNum);
사용할 수 있습니다.
다음에 비해 성능 면에서 이점이 있습니다.localeCompare
여기서 읽기
브라우저 비교 가능성(모든 브라우저가 지원)
let arr = ["A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"]
let op = arr.sort(new Intl.Collator('en',{numeric:true, sensitivity:'accent'}).compare)
console.log(op)
간단한 방법은 다음의 localCompare() 메서드를 사용하는 것입니다.JavaScript
https://www.w3schools.com/jsref/jsref_localecompare.asp
예:
export const sortAlphaNumeric = (a, b) => {
// convert to strings and force lowercase
a = typeof a === 'string' ? a.toLowerCase() : a.toString();
b = typeof b === 'string' ? b.toLowerCase() : b.toString();
return a.localeCompare(b);
};
예상 동작:
1000X Radonius Maximus
10X Radonius
200X Radonius
20X Radonius
20X Radonius Prime
30X Radonius
40X Radonius
Allegia 50 Clasteron
Allegia 500 Clasteron
Allegia 50B Clasteron
Allegia 51 Clasteron
Allegia 6R Clasteron
Alpha 100
Alpha 2
Alpha 200
Alpha 2A
Alpha 2A-8000
Alpha 2A-900
Callisto Morphamax
Callisto Morphamax 500
Callisto Morphamax 5000
Callisto Morphamax 600
Callisto Morphamax 6000 SE
Callisto Morphamax 6000 SE2
Callisto Morphamax 700
Callisto Morphamax 7000
Xiph Xlater 10000
Xiph Xlater 2000
Xiph Xlater 300
Xiph Xlater 40
Xiph Xlater 5
Xiph Xlater 50
Xiph Xlater 500
Xiph Xlater 5000
Xiph Xlater 58
var a1 =["A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"];
var a2 = a1.sort(function(a,b){
var charPart = [a.substring(0,1), b.substring(0,1)],
numPart = [a.substring(1)*1, b.substring(1)*1];
if(charPart[0] < charPart[1]) return -1;
else if(charPart[0] > charPart[1]) return 1;
else{ //(charPart[0] == charPart[1]){
if(numPart[0] < numPart[1]) return -1;
else if(numPart[0] > numPart[1]) return 1;
return 0;
}
});
$('#r').html(a2.toString())
이렇게 하면 됩니다.
function parseItem (item) {
const [, stringPart = '', numberPart = 0] = /(^[a-zA-Z]*)(\d*)$/.exec(item) || [];
return [stringPart, numberPart];
}
function sort (array) {
return array.sort((a, b) => {
const [stringA, numberA] = parseItem(a);
const [stringB, numberB] = parseItem(b);
const comparison = stringA.localeCompare(stringB);
return comparison === 0 ? Number(numberA) - Number(numberB) : comparison;
});
}
console.log(sort(['A1', 'A10', 'A11', 'A12', 'A2', 'A3', 'A4', 'B10', 'B2', 'F1', 'F12', 'F3']))
console.log(sort(['a25b', 'ab', 'a37b']))
저는 최근에 재고와 보관함 위치에 관한 프로젝트를 진행했습니다.데이터를 bin 위치별로 정렬해야 했고 개체 배열에 있었습니다.
이러한 유형의 데이터 정렬을 처리하고 데이터가 개체 배열에 있는 경우 다음 작업을 수행할 수 있습니다.
const myArray = [
{ location: 'B3', item: 'A', quantity: 25 },
{ location: 'A11', item: 'B', quantity: 5 },
{ location: 'A6', item: 'C', quantity: 245 },
{ location: 'A9', item: 'D', quantity: 15 },
{ location: 'B1', item: 'E', quantity: 65 },
{ location: 'SHOP', item: 'F', quantity: 42 },
{ location: 'A7', item: 'G', quantity: 57 },
{ location: 'A3', item: 'H', quantity: 324 },
{ location: 'B5', item: 'I', quantity: 4 },
{ location: 'A5', item: 'J', quantity: 58 },
{ location: 'B2', item: 'K', quantity: 45 },
{ location: 'A10', item: 'L', quantity: 29 },
{ location: 'A4', item: 'M', quantity: 11 },
{ location: 'B4', item: 'N', quantity: 47 },
{ location: 'A1', item: 'O', quantity: 55 },
{ location: 'A8', item: 'P', quantity: 842 },
{ location: 'A2', item: 'Q', quantity: 67 }
];
const sortArray = (sourceArray) => {
const sortByLocation = (a, b) => a.location.localeCompare(b.location, 'en', { numeric: true });
//Notice that I specify location here ^^ and here ^^ using dot notation
return sourceArray.sort(sortByLocation);
};
console.log('unsorted:', myArray);
console.log('sorted by location:', sortArray(myArray));
다른 키로도 쉽게 정렬할 수 있습니다.이 경우에는,item
또는quantity
스니펫에 표시된 것처럼 도트 표기법을 사용합니다.
Javascript Array Sort 함수는 함수를 비교하는 하나의 선택적 인수를 사용합니다.이 비교 기능을 요구 사항으로 설정할 수 있습니다.
arr.sort([compareFunction])
compare Function(선택 사항).정렬 순서를 정의하는 함수를 지정합니다.생략하면 각 요소의 문자열 변환에 따라 각 문자의 유니코드 코드 포인트 값에 따라 배열이 정렬됩니다. - MDN
epascarello의 수락된 답변에 추가하여, 저는 그것에 대해 언급할 수 없습니다.저는 아직 여기서 초보자입니다.문자열 중 하나에 번호가 없으면 원래 대답이 작동하지 않습니다.예를 들어 A와 A10은 그 순서대로 정렬되지 않습니다.따라서 이 경우 일반 정렬로 다시 이동할 수 있습니다.
var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
function sortAlphaNum(a,b) {
var aA = a.replace(reA, "");
var bA = b.replace(reA, "");
if(aA === bA) {
var aN = parseInt(a.replace(reN, ""), 10);
var bN = parseInt(b.replace(reN, ""), 10);
if(isNaN(bN) || isNaN(bN)){
return a > b ? 1 : -1;
}
return aN === bN ? 0 : aN > bN ? 1 : -1;
} else {
return aA > bA ? 1 : -1;
}
}
["A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12","F3"].sort(sortAlphaNum);`
위의 주어진 솔루션의 유일한 문제는 숫자 데이터가 같고 알파벳이 다양할 때 논리가 실패했다는 것입니다(예: 28AB, 28PQR, 28HBC).여기 수정된 코드가 있습니다.
var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
var AInt = parseInt(a, 10);
var BInt = parseInt(b, 10);
if(isNaN(AInt) && isNaN(BInt)){
var aA = a.replace(reA, "");
var bA = b.replace(reA, "");
if(aA === bA) {
var aN = parseInt(a.replace(reN, ""), 10);
var bN = parseInt(b.replace(reN, ""), 10);
alert("in if "+aN+" : "+bN);
return aN === bN ? 0 : aN > bN ? 1 : -1;
} else {
return aA > bA ? 1 : -1;
}
}else if(isNaN(AInt)){//A is not an Int
return 1;//to make alphanumeric sort first return 1 here
}else if(isNaN(BInt)){//B is not an Int
return -1;//to make alphanumeric sort first return -1 here
}else if(AInt == BInt) {
var aA = a.replace(reA, "");
var bA = b.replace(reA, "");
return aA > bA ? 1 : -1;
}
else {
return AInt > BInt ? 1 : -1;
}
다음은 이 답변에 대한 ES6 Types 스크립트 업그레이드입니다.
export function SortAlphaNum(a: string, b: string) {
const reA = /[^a-zA-Z]/g;
const reN = /[^0-9]/g;
const aA = a.replace(reA, "");
const bA = b.replace(reA, "");
if (aA === bA) {
const aN = parseInt(a.replace(reN, ""), 10);
const bN = parseInt(b.replace(reN, ""), 10);
return aN === bN ? 0 : aN > bN ? 1 : -1;
} else {
return aA > bA ? 1 : -1;
}
}
누군가가 더 깨끗한 접근법을 찾고 있을 때를 대비해서 말이죠localeCompare
arr.sort((a, b) => a.localeCompare(b, undefined,{ numeric: true }))
아래 스크립트로 위 정렬 문제를 해결했습니다.
arrVals.sort(function(a, b){
//return b.text - a.text;
var AInt = parseInt(a.text, 10);
var BInt = parseInt(b.text, 10);
if ($.isNumeric(a.text) == false && $.isNumeric(b.text) == false) {
var aA = a.text
var bA = b.text;
return aA > bA ? 1 : -1;
} else if ($.isNumeric(a.text) == false) { // A is not an Int
return 1; // to make alphanumeric sort first return -1 here
} else if ($.isNumeric(b.text) == false) { // B is not an Int
return -1; // to make alphanumeric sort first return 1 here
} else {
return AInt < BInt ? 1 : -1;
}
});
이것은 잘 혼합된 배열에서 잘 작동합니다.:)
감사해요.
alphaNumericCompare(a, b) {
let ax = [], bx = [];
a.replace(/(\d+)|(\D+)/g, function (_, $1, $2) { ax.push([$1 || Infinity, $2 || '']) });
b.replace(/(\d+)|(\D+)/g, function (_, $1, $2) { bx.push([$1 || Infinity, $2 || '']) });
while (ax.length && bx.length) {
let an = ax.shift();
let bn = bx.shift();
let nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
if (nn) {
return nn;
}
}
return ax.length - bx.length;
}
이것은 저에게 효과가 있었고 좀 더 콤팩트합니다.
const reg = /[0-9]+/g;
array.sort((a, b) => {
let v0 = a.replace(reg, v => v.padStart(10, '0'));
let v1 = b.replace(reg, v => v.padStart(10, '0'));
return v0.localeCompare(v1);
});
라이브러리 기능으로 TypeScript로 제공되는 버전(@SunnyPenguin & @Code Maniac의 답변을 기반으로 함)이 있습니다.변수 이름이 업데이트되고 명확한 설명이 추가되었습니다.
// Sorts strings with numbers by keeping the numbers in ascending order
export const sortAlphaNum: Function = (a: string, b: string, locale: string): number => {
const letters: RegExp = /[^a-zA-Z]/g;
const lettersOfA: string = a.replace(letters, '');
const lettersOfB: string = b.replace(letters, '');
if (lettersOfA === lettersOfB) {
const numbers: RegExp = /[^0-9]/g;
const numbersOfA: number = parseInt(a.replace(numbers, ''), 10);
const numbersOfB: number = parseInt(b.replace(numbers, ''), 10);
if (isNaN(numbersOfA) || isNaN(numbersOfB)) {
// One is not a number - comparing letters only
return new Intl.Collator(locale, { sensitivity: 'accent' }).compare(a, b);
}
// Both have numbers - compare the numerical parts
return numbersOfA === numbersOfB ? 0 : numbersOfA > numbersOfB ? 1 : -1;
} else {
// Letter parts are different - comparing letters only
return new Intl.Collator(locale, { sensitivity: 'accent' }).compare(lettersOfA, lettersOfB);
}
};
function sortAlphaNum(a, b) {
var smlla = a.toLowerCase();
var smllb = b.toLowerCase();
var result = smlla > smllb ? 1 : -1;
return result;
}
언급URL : https://stackoverflow.com/questions/4340227/sort-mixed-alpha-numeric-array
'IT' 카테고리의 다른 글
mysql(Mariadb)을 다시 시작한 후 다시 시작하는 데 5분이 걸립니다. (0) | 2023.08.26 |
---|---|
Git의 *safe.directory*에 상위 디렉토리를 추가할 수 없습니다. (0) | 2023.08.26 |
PowerShell 필수 매개 변수는 다른 매개 변수에 따라 다릅니다. (0) | 2023.08.26 |
jQuery를 사용하여 상대 경로 결정 (0) | 2023.08.26 |
숫자를 6 PHP로 나눌 수 있는지 확인하기 (0) | 2023.08.26 |