JavaScript 목록에 문자열이 있는지 확인합니다.
SQL에서는 다음과 같은 문자열이 목록에 있는지 확인할 수 있습니다.
Column IN ('a', 'b', 'c')
JavaScript에서 이를 수행하는 좋은 방법은 무엇입니까?이렇게 하는 건 너무 투박해
if (expression1 || expression2 || str === 'a' || str === 'b' || str === 'c') {
// do something
}
그리고 이 기능의 성능이나 명료성은 잘 모르겠습니다.
if (expression1 || expression2 || {a:1, b:1, c:1}[str]) {
// do something
}
또는 스위치 기능을 사용할 수 있습니다.
var str = 'a',
flag = false;
switch (str) {
case 'a':
case 'b':
case 'c':
flag = true;
default:
}
if (expression1 || expression2 || flag) {
// do something
}
하지만 그것은 끔찍한 엉망진창이다.좋은 생각 있어요?
이 경우 회사 인트라넷 페이지용이기 때문에 Internet Explorer 7을 사용해야 합니다.그렇게['a', 'b', 'c'].indexOf(str) !== -1
구문설탕이 없으면 기본적으로 작동하지 않습니다.
ES6(ES2015) 이후
ECMAScript 6(일명 ECMAScript 6)을 사용하는 경우ES2015) 이상에서는 항목 배열을 구성하고 다음을 사용하는 것이 가장 깨끗한 방법입니다.
['a', 'b', 'c'].includes('b')
이 방법에는 다음과 같은 고유한 이점이 있습니다.indexOf
그것이 존재하는지 여부를 적절하게 테스트할 수 있기 때문이다.NaN
목록 내 및 에 있는 가운데와 같은 누락된 배열 요소와 일치할 수 있습니다.[1, , 2]
로.undefined
치료도 합니다.+0
그리고.-0
동등하게 합니다. includes
는, 다음과 같은 JavaScript 타입의 어레이에서도 동작합니다.Uint8Array
.
브라우저 지원(예: IE 또는 Edge)에 관심이 있는 경우,IUse.Com 및 누락된 브라우저 또는 브라우저 버전을 대상으로 하는 경우includes
Babel 등의 툴을 사용하여 하위 ECMAScript 버전으로 변환하거나 polyfill.io에서 구할 수 있는 것과 같은 폴리필 스크립트를 브라우저에 포함해야 합니다.
퍼포먼스 향상
주의:Array.includes()
어레이 내의 요소 수에 따라 확장 가능: 퍼포먼스 O(n)가 있습니다.보다 높은 퍼포먼스가 필요하고 항목 세트를 반복적으로 구성하지 않는 경우(단, 항목에 일부 요소가 포함되어 있는지 반복적으로 확인함) ES 사양에서는 다음 기능을 구현해야 하므로 를 사용해야 합니다.Set
(그리고Map
또한) 판독에 대해 하위 선형이어야 합니다.
이 사양에서는 "평균적으로 컬렉션 내의 요소 수에 대해 선형 이하의 액세스 시간을 제공하는" 세트를 구현할 것을 요구하고 있습니다.따라서 복잡도가 O(N)보다 높으면 내부적으로 해시 테이블(O(1) 룩업을 사용), 검색 트리(O(log(N) 룩업을 사용) 또는 기타 데이터 구조로 나타낼 수 있습니다.
const interestingItems = new Set(['a', 'b', 'c'])
const isItemInSet = interestingItems.has('b')
반복 가능한 모든 항목을 에 전달할 수 있습니다.Set
컨스트럭터(...을 지원하는 모든 것)변환도 할 수 있습니다.Set
를 사용하여 어레이에 접속합니다.Array.from(set)
또는 퍼트림으로써[...set]
.
어레이 없음
이것은 별로 권장되지 않지만 새로 추가할 수 있습니다.isInList
다음과 같이 속성을 문자열로 변환합니다.
if (!String.prototype.isInList) {
Object.defineProperty(String.prototype, 'isInList', {
get: () => function(...args) {
let value = this.valueOf();
for (let i = 0, l = args.length; i < l; i += 1) {
if (arguments[i] === value) return true;
}
return false;
}
});
}
그런 다음 다음과 같이 사용합니다.
'fox'.isInList('weasel', 'fox', 'stoat') // true
'fox'.isInList('weasel', 'stoat') // false
동일한 작업을 수행할 수 있습니다.Number.prototype
.
주의:Object.defineProperty
IE8 이전 버전 또는 매우 오래된 버전의 다른 브라우저에서는 사용할 수 없습니다.단, 이는 에 대한 훨씬 뛰어난 해결책입니다.String.prototype.isInList = function() { ... }
왜냐하면 그렇게 간단한 할당을 사용하는 것은 열거할 수 있는 속성을 만들 것이기 때문입니다.String.prototype
이 경우 코드가 깨질 가능성이 높아집니다.
Array.index Of
최신 브라우저를 사용하는 경우indexOf
항상 동작합니다.단, IE8 이전 버전에서는 폴리필이 필요합니다.
한다면indexOf
-1을 반환합니다. 항목이 목록에 없습니다.다만, 이 방법으로는, 다음의 정보가 올바르게 체크되지 않는 것에 주의해 주세요.NaN
, 및 그것이 명시적인 것과 일치할 수 있습니다.undefined
누락된 요소를 에 일치시킬 수 없습니다.undefined
배열과 같이[1, , 2]
.
폴리필:indexOf
또는includes
IE 또는 지원이 없는 다른 브라우저/버전
위에서 설명한 바와 같이 polyfill.io과 같은 서비스를 사용하고 싶지 않은 경우 언제든지 자체 소스 코드 표준에 준거한 커스텀 폴리필을 포함할 수 있습니다.예를 들어 Mozilla Developer Network에는 용 파일이 있습니다.
7의 하는 Explorer 7의 을 'indexOf()
'CHANGE: 'CHANGE: 'CHANGE: 'CHANGE:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
개체 프로토타입 수정에 대한 참고 사항
저는 수정은 안 할 것 String.prototype
★★★★★★★★★★★★★★★★★」Array.prototype
장기적으로는 좋은 전략입니다.JavaScript에서 개체 프로토타입을 수정하면 심각한 버그가 발생할 수 있습니다.자신의 환경에서 안전한지 여부를 결정해야 합니다.은 어레이(Array를 "Array.protype" (Array.protype)로 입니다.for ... in
는 키 중 새합니다.키 음음 、 음 will 、 will will 、 will will 、 will will will will will will will will will will will 。
Array.prototype.blah = function() { console.log('blah'); };
let arr = [1, 2, 3];
for (let x in arr) { console.log(x); }
// Result:
0
1
2
blah // Extra member iterated over!
당신의 코드는 지금 작동할지 모르지만, 미래에 누군가가 상속된 키에 대해 열심히 보호하지 않는 서드파티제의 JavaScript 라이브러리나 플러그인을 추가하는 순간, 모든 것이 망가질 수 있습니다.
이 시 되지 않은 있는지 각if (arr.hasOwnProperty(x))
그 다음에야 그걸로 작업하고x
.
이 추가 키 문제를 회피하는 새로운 ES6 방법은 다음과 같습니다.
of
in
,for (let x of arr)
그러나 출력 대상과 하향 레벨링 트랜스필러의 정확한 설정/기능에 따라서는 신뢰성이 떨어질 수 있습니다.모든 및 가 이하게 준수하고 할 수 한이이 방법을 하는 것이 .includes
상기와 같이을 사용하여 합니다.
Object.defineProperty()
이 경우 속성(기본값)은 열거할 수 없게 됩니다.이는 사용하는 모든 JavaScript 라이브러리 또는 모듈이 이 기능을 수행해야만 문제를 진정으로 해결할 수 있습니다.
마지막 문제에 주의하다
마지막으로, 폴리 매립지가 타당하고 객체 프로토타입을 수정하는 것이 유용한 전략이지만, 이러한 접근 방식에는 여전히 범위 지정 문제가 있을 수 있습니다.
다른 「동일」, 「동일」이 됩니다.document
그 JS에서는, fragment 등를하거나, 다른할 수 .document
객체(예: 이름 있는 대상 링크를 사용한 페이지 간 통신)를 통해 객체 프로토타입이 원하는 방법을 갖지 못할 수 있습니다. 단, 새로운 글로벌 객체에 대해 항상 폴리필을 다시 실행할 수 있습니다.
Node.js의 global
오브젝트는 안전할 수 있지만 글로벌하지 않은 Import된 오브젝트의 프로토타입을 수정하면 두 버전의 동일한 오브젝트가 노출되지 않기 때문에 동일한 패키지의 두 버전이 요구되거나 삭제될 경우 파손될 수 있습니다. 또는 하고, 하지 않고 한 「」, 「」, 「」, 「」, 「」의 코드를 사용할 때까지, 코드는 할 수 .npm install
또는yarn install
이 문제를 일으킬 수 있습니다.(이 문제를 해결할 수 있는 옵션이 있습니다.예를 들어 실의resolutions
의 재산package.json
하지만 다른 선택지가 있다면 그건 좋은 일이 아닙니다.)
전화하시면 됩니다.indexOf
:
if (['a', 'b', 'c'].indexOf(str) >= 0) {
//do something
}
대부분의 답변은 다음과 같습니다.Array.prototype.indexOf
유일한 문제는 IE9 이전 버전에서는 동작하지 않는다는 것입니다.
대신 모든 브라우저에서 사용할 수 있는 다음 두 가지 옵션을 더 제공합니다.
if (/Foo|Bar|Baz/.test(str)) {
// ...
}
if (str.match("Foo|Bar|Baz")) {
// ...
}
어레이에는indexOf
문자열 검색에 사용할 수 있는 메서드:
js> a = ['foo', 'bar', 'baz']
foo,bar,baz
js> a.indexOf('bar')
1
js> a.indexOf('quux')
-1
제가 사용한 트릭은
>>> ("something" in {"a string":"", "somthing":"", "another string":""})
false
>>> ("something" in {"a string":"", "something":"", "another string":""})
true
이런 걸 할 수 있어요
>>> a = ["a string", "something", "another string"];
>>> b = {};
>>> for(var i=0; i<a.length;i++){b[a[i]]="";} /* Transform the array in a dict */
>>> ("something" in b)
true
에 더하여indexOf
시제품의 Enumable.include()를 사용하면 보다 깔끔하고 간결하게 만들 수 있습니다.
var list = ['a', 'b', 'c'];
if (list.includes(str)) {
// do stuff
}
여기 제 것이 있습니다.
String.prototype.inList=function(list){
return (Array.apply(null, arguments).indexOf(this.toString()) != -1)
}
var x = 'abc';
if (x.inList('aaa','bbb','abc'))
console.log('yes');
else
console.log('no');
어레이 전달에 문제가 없다면 이 방법이 더 빠릅니다.
String.prototype.inList=function(list){
return (list.indexOf(this.toString()) != -1)
}
var x = 'abc';
if (x.inList(['aaa','bbb','abc']))
console.log('yes')
여기 jsperf가 있습니다.http://jsperf.com/bmcgin-inlsit
indexOf 사용(IE8에서는 동작하지 않습니다).
if (['apple', 'cherry', 'orange', 'banana'].indexOf(value) >= 0) {
// found
}
IE8을 지원하기 위해 Mozilla의 indexOf를 구현할 수 있습니다.
if (!Array.prototype.indexOf) {
// indexOf polyfill code here
}
String.protype.match(docs)를 통한 정규 표현.
if (fruit.match(/^(banana|lemon|mango|pineapple)$/)) {
}
RegExp
범용성이지만 어레이를 사용하고 있는 것은 이해합니다.이 접근방식을 확인해 주세요.예전에 사용했는데, 매우 효과적이고 빠르게 타오릅니다!
var str = 'some string with a';
var list = ['a', 'b', 'c'];
var rx = new RegExp(list.join('|'));
rx.test(str);
다음과 같은 몇 가지 수정을 적용할 수도 있습니다.
원라이너
new RegExp(list.join('|')).test(str);
대소문자를 구분하지 않음
var rx = new RegExp(list.join('|').concat('/i'));
그리고 다른 많은 것들도!
in_array 함수를 사용해야 할 것 같습니다.
jQuery -> 어레이 내
프로토타입 -> Array.index Of
또는 jQuery 또는 프로토타입을 사용하지 않는 경우 다음 예를 참조하십시오.
- http://phpjs.org/functions/in_array:432
- http://www.bitrepository.com/equivalent-of-phps-in_array-function.html
- http://codingforums.com/showthread.php?t=63796
스타일리시한 메모:이것(thisthing thatthing)이라고 하는 이름의 변수는, 그것이 무엇을 포함하고 있는지를 나타내는 이름을 붙여야 합니다(명사).
질문 및 Array.index Of 메서드를 사용한 솔루션에 대해 감사합니다.
저는 이 솔루션의 코드를 사용하여 IMO를 통해 쓰기를 단순화하고 읽기 쉽게 하는 inList() 함수를 만들었습니다.
function inList(psString, psList)
{
var laList = psList.split(',');
var i = laList.length;
while (i--) {
if (laList[i] === psString) return true;
}
return false;
}
용도:
if (inList('Houston', 'LA,New York,Houston') {
// THEN do something when your string is in the list
}
문자열과 목록이 필요한 간단한 기능에 대해 아무도 언급하지 않은 것이 놀랍습니다.
function in_list(needle, hay)
{
var i, len;
for (i = 0, len = hay.length; i < len; i++)
{
if (hay[i] == needle) { return true; }
}
return false;
}
var alist = ["test"];
console.log(in_list("test", alist));
솔루션에는 다음과 같은 구문이 있습니다.
// Checking to see if var 'column' is in array ['a', 'b', 'c']
if (column.isAmong(['a', 'b', 'c']) {
// Do something
}
기본 객체 프로토타입을 다음과 같이 확장하여 구현합니다.
Object.prototype.isAmong = function (MyArray){
for (var a=0; a<MyArray.length; a++) {
if (this === MyArray[a]) {
return true;
}
}
return false;
}
대신 메서드를 isInArray(그러나 inArray는 아닐 수 있음) 또는 단순히 isIn으로 명명할 수 있습니다.
장점:심플하고 알기 쉬우며 자기 문서화도 가능합니다.
SLaks의 답변의 간략화 버전도 기능합니다.
if ('abcdefghij'.indexOf(str) >= 0) {
// Do something
}
...문자열 자체가 일종의 배열이기 때문입니다.:)
필요에 따라 앞에서 설명한 대로 Internet Explorer의 인덱스 오브 함수를 구현합니다.
나의 작은 공헌:
function fnListIndexOf(pList, pValue)
{
return pList.split(",").indexOf (pValue);
}
fnListIndexOf("1,2,3,4,5,a,b,c","a")
언급URL : https://stackoverflow.com/questions/2430000/determine-if-string-is-in-list-in-javascript
'programing' 카테고리의 다른 글
CNTLM에서의 프록시 배후에 pip 사용 (0) | 2022.09.28 |
---|---|
각도란?JS는 jQuery와 다릅니다. (0) | 2022.09.28 |
Keras, 각 레이어의 출력을 취득하려면 어떻게 해야 합니까? (0) | 2022.09.27 |
Larabel 5의 스위치(블레이드) (0) | 2022.09.27 |
ClassLoader.getResources()를 올바르게 사용하는 방법 (0) | 2022.09.27 |