자바 스크립트에서 문자열이 목록에 있는지 확인
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
어떤 구문 설탕없이 기본적으로 작동하지 않습니다.
당신은 전화 할 수 있습니다 indexOf
:
if (['a', 'b', 'c'].indexOf(str) >= 0) {
//do something
}
EcmaScript 6
ES6을 사용하는 경우 항목의 배열을 구성하고 다음을 사용할 수 있습니다 includes
.
['a', 'b', 'c'].includes('b')
이 이상의 몇 가지 고유의 장점이 indexOf
제대로의 존재를 테스트 할 수 있기 때문에 NaN
목록을, 등의 중간 하나없는 배열 요소와 일치 수 [1, , 2]
에를 undefined
. 와 같은 JavaScript 형식의 배열includes
에서도 작동합니다 .Uint8Array
배열없이
isInList
다음과 같이 문자열에 새 속성을 추가 할 수 있습니다 .
if (!String.prototype.isInList) {
String.prototype.isInList = function() {
let value = this.valueOf();
for (let i = 0, l = arguments.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
.
Array.indexOf
최신 브라우저를 사용하는 경우 indexOf
항상 작동합니다. 그러나 IE8 및 이전 버전의 경우 폴리 필이 필요합니다.
경우 indexOf
-1을 반환 항목은 목록에 없습니다. 그러나이 메소드는 제대로 검사하지 않으며 NaN
명시 적과 일치 undefined
할 수 있지만 누락 된 요소 undefined
는 배열에서 와 일치 할 수 없습니다 [1, , 2]
.
indexOf
Internet Explorer 8 및 이전 버전 또는이 버전이없는 다른 브라우저의 폴리 필
항상 표준 호환 사용자 정의 폴리 필 을 사용하여 이전 브라우저에서이 작업을 수행 할 수 있습니다.
Internet Explorer 7 용 솔루션을 만들어야하는이 상황에서 indexOf()
표준과 호환되지 않는 간단한 버전의 기능을 "내 자신의 롤"으로 만들었습니다 .
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
그러나 Array.prototype
장기적으로 수정 이 최선의 대답 이라고 생각하지 않습니다 . JavaScript에서 수정 Object
및 Array
프로토 타입을 작성하면 심각한 버그가 발생할 수 있습니다. 자신의 환경에서 안전한지 결정해야합니다. 중요한 것은 배열을 반복하면 (Array.prototype이 속성을 추가 한 경우) for ... in
새 함수 이름을 키 중 하나로 반환한다는 것입니다.
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
위에서 언급 한대로 사용하고 싶을 것입니다 .
답변의 대부분은 제안 Array.prototype.indexOf
방법은, 유일한 문제는 그것이 작동하지 것입니다 어떤 IE9 이전 IE 버전.
대안으로 모든 브라우저에서 작동하는 두 가지 옵션을 더 남겨 둡니다.
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
내 꺼야 :
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
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-> inArray
프로토 타입-> Array.indexOf
또는 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
양식 참고 사항 : 이것으로 명명 된 변수는 이름에 포함 된 이름 (명사)에 대해 알려주도록 명명되어야합니다.
indexOf
프로토 타입의 Enumerable.include () 를 사용하면 ( 다른 포스터가 제안한 것 외에도 ) 더 깔끔하고 간결하게 만들 수 있습니다.
var list = ['a', 'b', 'c'];
if (list.include(str)) {
// do stuff
}
질문과 Array.indexOf 메서드를 사용하는 솔루션에 감사드립니다.
이 솔루션의 코드를 사용하여 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
}
indexOf 사용 (IE8에서는 작동하지 않습니다).
if (['apple', 'cherry', 'orange', 'banana'].indexOf(value) >= 0) {
// found
}
IE8을 지원하기 위해 Mozilla의 indexOf를 구현할 수 있습니다.
if (!Array.prototype.indexOf) {
// indexOf polyfill code here
}
String.prototype.match (docs)를 통한 정규 표현식
if (fruit.match(/^(banana|lemon|mango|pineapple)$/)) {
}
문자열과 목록을 취하는 간단한 함수를 언급 한 사람이 아무도 없습니다.
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 프로토 타입을 다음과 같이 확장하여 구현합니다.
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 용 indexof 함수를 구현하십시오.
참고 URL : https://stackoverflow.com/questions/2430000/determine-if-string-is-in-list-in-javascript
'IT story' 카테고리의 다른 글
클립 : : 오류 : : 누락 요구 사항 유효성 검사기 레일 4 오류 (0) | 2020.04.20 |
---|---|
문자열이 유효한 HTTP URL인지 확인하는 방법은 무엇입니까? (0) | 2020.04.20 |
쉘 스크립트에서 주석 차단 (0) | 2020.04.20 |
jQuery를 사용하여 페이지로드시 양식 입력 텍스트 필드에 집중하는 방법은 무엇입니까? (0) | 2020.04.20 |
Xcode 빌드 옵션의 영향 "비트 코드 사용"예 / 아니요 (0) | 2020.04.19 |