자바 스크립트 : 하나의 값을 여러 값과 비교하는 가장 예쁜 방법
이 질문에 이미 답변이 있습니다.
- 여러 값과 비교하는 간결한 방법 8 답변
하나의 값을 여러 옵션과 비교 하는 가장 좋은 방법은 무엇입니까?
이 작업을 수행하는 방법에는 여러 가지가 있지만 가장 좋은 방법을 찾고 있습니다.
나는 이것이 실행 가능하기를 바 랐기 때문에 묻습니다 (당신이 그것을 볼 때 분명히 그렇지 않습니다).
if (foobar == (foo||bar) ) {
//do something
}
특히 성능에 불필요하게 영향을 미칠 때 너무 교활하게 굴지 마십시오. 정말로 할 비교가 많으면 형식을 잘 지정하십시오.
if (foobar === foo ||
foobar === bar ||
foobar === baz ||
foobar === pew) {
//do something
}
내가 사용하는 것은 다음과 같은 배열에 여러 값을 넣는 것입니다.
var options = [foo, bar];
그런 다음 indexOf ()를 사용하십시오.
if(options.indexOf(foobar) > -1){
//do something
}
아름다움을 위해 :
if([foo, bar].indexOf(foobar) +1){
//you can't get any more pretty than this :)
}
및 이전 브라우저 :
( https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/IndexOf )
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
"use strict";
if (this == null) {
throw new TypeError();
}
var t = Object(this);
var len = t.length >>> 0;
if (len === 0) {
return -1;
}
var n = 0;
if (arguments.length > 0) {
n = Number(arguments[1]);
if (n != n) { // shortcut for verifying if it's NaN
n = 0;
} else if (n != 0 && n != Infinity && n != -Infinity) {
n = (n > 0 || -1) * Math.floor(Math.abs(n));
}
}
if (n >= len) {
return -1;
}
var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
for (; k < len; k++) {
if (k in t && t[k] === searchElement) {
return k;
}
}
return -1;
}
}
스위치를 사용할 수 있습니다.
switch (foobar) {
case foo:
case bar:
// do something
}
이 Q & A는 구문 미세 분석에 관한 것으로 보이므로 André Alçada Padez의 제안을 아주 조금 수정했습니다.
(물론 그가 포함 된 pre-IE9 shim / shiv / polyfill을 고려)
if (~[foo, bar].indexOf(foobar)) {
// pretty
}
아무도 아직 두 가지 비교에 대해 잘 작동하는 확실한 솔루션을 추가하지 않았으므로 제공 할 것입니다.
if (foobar === foo || foobar === bar) {
//do something
}
그리고 값이 많은 경우 (아마 수백 또는 수천 개) Set을 만드는 것이 좋습니다. 이것은 매우 깨끗하고 간단한 비교 코드를 만들고 런타임에 빠릅니다.
// pre-construct the Set
var tSet = new Set(["foo", "bar", "test1", "test2", "test3", ...]);
// test the Set at runtime
if (tSet.has(foobar)) {
// do something
}
ES6 이전의 경우 많은 수의 Set polyfill을 얻을 수 있습니다. 하나는 다른 대답에 설명되어 있습니다.
Why not using indexOf
from array like bellow?
if ([foo, bar].indexOf(foobar) !== -1) {
// do something
}
Just plain Javascript, no frameworks or libraries but it will not work on IE < 9.
(foobar == foo || foobar == bar)
otherwise if you are comparing expressions based only on a single integer, enumerated value, or String object you can use switch. See The switch Statement. You can also use the method suggested by André Alçada Padez. Ultimately what you select will need to depend on the details of what you are doing.
I like the pretty form of testing indexOf with an array, but be aware, this doesn't work in all browsers (because Array.prototype.indexOf is not present in old IExplorers).
However, there is a similar way by using jQuery with the $.inArray() function :
if ($.inArray(field, ['value1', 'value2', 'value3']) > -1) {
alert('value ' + field + ' is into the list');
}
It could be better, so you should not test if indexOf exists.
Be careful with the comparison (don't use == true/false), because $.inArray returns the index of matching position where the value has been found, and if the index is 0, it would be false when it really exist into the array.
The switch method (as mentioned by Guffa) works very nicely indeed. However, the default warning settings in most linters will alert you about the use of fall-through. It's one of the main reasons I use switches at all, so I pretty much ignore this warning, but you should be aware that the using the fall-through feature of the switch statement can be tricky. In cases like this, though - I'd go for it.
'Program Tip' 카테고리의 다른 글
Ruby on Rails의 숨겨진 기능 (0) | 2020.12.13 |
---|---|
iPhone에서 Core Data 프로그램에 대한 고유 ID 생성 (0) | 2020.12.13 |
XAML에서 Canvas의 Children 속성을 바인딩 할 수 있습니까? (0) | 2020.12.13 |
C ++에서 int에서 상속 할 수없는 이유는 무엇입니까? (0) | 2020.12.13 |
루비에서 사용자의 홈 디렉토리를 얻는 크로스 플랫폼 수단? (0) | 2020.12.13 |