JavaScript에서 문자열 배열을 대소문자를 구분하지 않고 정렬하려면 어떻게 해야 합니까?
JavaScript에서 정렬해야 하는 문자열 배열이 있지만 대소문자를 구분하지 않습니다.이거 어떻게 하는 거야?
(거의 :) 원라이너로
["Foo", "bar"].sort(function (a, b) {
return a.toLowerCase().localeCompare(b.toLowerCase());
});
그 결과
[ 'bar', 'Foo' ]
하는 동안에
["Foo", "bar"].sort();
을 낳다
[ 'Foo', 'bar' ]
이 오래된 질문을 다시 할 시간이다.
다음 항목에 의존하는 솔루션을 사용하면 안 됩니다.toLowerCase
비효율적이고 일부 언어(터키어 등)에서는 작동하지 않습니다.다음을 선호합니다.
['Foo', 'bar'].sort((a, b) => a.localeCompare(b, undefined, {sensitivity: 'base'}))
이 매뉴얼에서 브라우저 호환성 및 에 대한 모든 정보를 확인하십시오.sensitivity
선택.
myArray.sort(
function(a, b) {
if (a.toLowerCase() < b.toLowerCase()) return -1;
if (a.toLowerCase() > b.toLowerCase()) return 1;
return 0;
}
);
편집: 원래는 퍼포먼스를 염두에 둔 것이 아니라 테크닉을 설명하기 위해 작성한 것입니다.보다 콤팩트한 솔루션에 대해서는, @Ivan Krechetov 의 회답도 참조해 주세요.
arr.sort(function(a,b) {
a = a.toLowerCase();
b = b.toLowerCase();
if (a == b) return 0;
if (a > b) return 1;
return -1;
});
ES6 버전:
["Foo", "bar"].sort(Intl.Collator().compare)
출처 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator/compare
또한 MDN별로 어레이를 정렬할 때 더욱 효율적입니다.단점은 오래된 브라우저에서는 지원되지 않는다는 것입니다.
MDN에서는 Safari에서는 전혀 지원되지 않는다고 합니다. 지원 대상이라고 기재되어 있기 때문에 검증이 필요합니다.
대규모 배열 정렬 등 다수의 문자열을 비교할 때는 Intl을 작성하는 것이 좋습니다.오브젝트를 대조하여 비교 속성에 의해 제공되는 함수를 사용합니다.
["Foo", "bar"].sort(Intl.Collator().compare); //["bar", "Foo"]
입력 배열의 요소 순서에 관계없이 동일한 순서를 보장하려면 다음과 같이 안정적인 정렬을 수행합니다.
myArray.sort(function(a, b) {
/* Storing case insensitive comparison */
var comparison = a.toLowerCase().localeCompare(b.toLowerCase());
/* If strings are equal in case insensitive comparison */
if (comparison === 0) {
/* Return case sensitive comparison instead */
return a.localeCompare(b);
}
/* Otherwise return result */
return comparison;
});
의 케이스의 정규화.sort()
와 함께.toLowerCase()
.
엘비스 오퍼레이터를 사용할 수도 있습니다.
arr = ['Bob', 'charley', 'fudge', 'Fudge', 'biscuit'];
arr.sort(function(s1, s2){
var l=s1.toLowerCase(), m=s2.toLowerCase();
return l===m?0:l>m?1:-1;
});
console.log(arr);
제공 내용:
biscuit,Bob,charley,fudge,Fudge
localCompare 메서드는 아마 문제가 없을 것입니다만...
참고: Elvis 연산자는 짧은 형식의 '삼진 연산자'로, 그렇지 않은 경우 대개 할당이 있습니다.
옆으로 보면 엘비스가...
즉, 다음 대신:
if (y) {
x = 1;
} else {
x = 2;
}
다음을 사용할 수 있습니다.
x = y?1:2;
즉, y가 참이면 1을 반환하고(x에 할당), 그렇지 않으면 2를 반환합니다(x에 할당).
다른 답변은 배열에 문자열이 포함되어 있다고 가정합니다.배열에 늘 문자열, 정의되지 않은 문자열 또는 기타 문자열이 포함되어 있어도 작동하므로 이 방법이 더 좋습니다.
var notdefined;
var myarray = ['a', 'c', null, notdefined, 'nulk', 'BYE', 'nulm'];
myarray.sort(ignoreCase);
alert(JSON.stringify(myarray)); // show the result
function ignoreCase(a,b) {
return (''+a).toUpperCase() < (''+b).toUpperCase() ? -1 : 1;
}
그null
'nullk'와 'nullm'으로 분류됩니다.근데...undefined
항상 마지막에 정렬됩니다.
수용된 답변을 뒷받침하기 위해 아래 함수는 원래 배열의 값을 변경하여 소문자를 정렬할 뿐만 아니라 대문자 값도 소문자로 변경합니다.메리 옆에 있는 메리를 보고 싶어도 첫 번째 값인 메리의 케이스를 소문자로 바꾸고 싶지 않기 때문에 곤란합니다.
myArray.sort(
function(a, b) {
if (a.toLowerCase() < b.toLowerCase()) return -1;
if (a.toLowerCase() > b.toLowerCase()) return 1;
return 0;
}
);
제 실험에서는 승인된 답변의 다음 함수는 올바르게 정렬되지만 값은 변경되지 않습니다.
["Foo", "bar"].sort(function (a, b) {
return a.toLowerCase().localeCompare(b.toLowerCase());
});
arr.sort(function(a,b) {
a = a.toLowerCase();
b = b.toLowerCase();
if( a == b) return 0;
if( a > b) return 1;
return -1;
});
위 함수에서는 소문자 2의 값 a와 b를 비교만 하면 예쁜 결과를 얻을 수 없습니다.
예를 들어 어레이가 [A, a, B, b, c, C, D, d, e, E]이고 위의 함수를 사용하는 경우 어레이는 정확히 그 어레이가 됩니다.아무것도 바뀌지 않았어요.
[A, a, B, b, C, c, D, d, E, e]의 결과를 얻으려면 다음 두 개의 소문자 값이 같을 때 다시 비교해야 합니다.
function caseInsensitiveComparator(valueA, valueB) {
var valueALowerCase = valueA.toLowerCase();
var valueBLowerCase = valueB.toLowerCase();
if (valueALowerCase < valueBLowerCase) {
return -1;
} else if (valueALowerCase > valueBLowerCase) {
return 1;
} else { //valueALowerCase === valueBLowerCase
if (valueA < valueB) {
return -1;
} else if (valueA > valueB) {
return 1;
} else {
return 0;
}
}
}
다음 사항을 이해하는데 어려움을 겪고 있는 경우 도움이 될 수 있습니다.
var array = ["sort", "Me", "alphabetically", "But", "Ignore", "case"];
console.log('Unordered array ---', array, '------------');
array.sort(function(a,b) {
a = a.toLowerCase();
b = b.toLowerCase();
console.log("Compare '" + a + "' and '" + b + "'");
if( a == b) {
console.log('Comparison result, 0 --- leave as is ');
return 0;
}
if( a > b) {
console.log('Comparison result, 1 --- move '+b+' to before '+a+' ');
return 1;
}
console.log('Comparison result, -1 --- move '+a+' to before '+b+' ');
return -1;
});
console.log('Ordered array ---', array, '------------');
// return logic
/***
If compareFunction(a, b) is less than 0, sort a to a lower index than b, i.e. a comes first.
If compareFunction(a, b) returns 0, leave a and b unchanged with respect to each other, but sorted with respect to all different elements. Note: the ECMAscript standard does not guarantee this behaviour, and thus not all browsers (e.g. Mozilla versions dating back to at least 2003) respect this.
If compareFunction(a, b) is greater than 0, sort b to a lower index than a.
***/
http://jsfiddle.net/ianjamieson/wmxn2ram/1/
문자열 배열에서 .sortIgnoreCase()를 호출할 수 있도록 상위 답변을 폴리필로 감았습니다.
// Array.sortIgnoreCase() polyfill
if (!Array.prototype.sortIgnoreCase) {
Array.prototype.sortIgnoreCase = function () {
return this.sort(function (a, b) {
return a.toLowerCase().localeCompare(b.toLowerCase());
});
};
}
in끈을 in / /i
하여 케이스를
언급URL : https://stackoverflow.com/questions/8996963/how-to-perform-case-insensitive-sorting-array-of-string-in-javascript
'programing' 카테고리의 다른 글
ID 필드별로 Vuex에 저장된 개체 배열에서 항목을 가져오려면 어떻게 해야 합니까? (0) | 2023.01.23 |
---|---|
jQuery를 사용하여 이름으로 요소를 선택하려면 어떻게 해야 합니까? (0) | 2023.01.23 |
Vue.js와 Flask를 결합하려면 어떻게 해야 하나요? (0) | 2023.01.23 |
Python에서 여러 줄의 코멘트를 작성하려면 어떻게 해야 하나요? (0) | 2023.01.13 |
중첩된 사전을 구현하는 가장 좋은 방법은 무엇입니까? (0) | 2023.01.13 |