예를 들어 이 같은 것:
var value = someArray.indexOf(3) !== -1 ? someArray.indexOf(3) : 0
더 좋은 방법이 있을 쓰는? 다시 나에 대한 답변을 찾고 정확한 질문을 위한 예제할 수 있는 경우가 반복되는 피연산자에 원자 식...
해야 할 코드를 읽을 수 있는,그래서는 간결한 의미하지 않아야되는 간결한 어떤 비용에 대한해야 하는 게시하는 https://codegolf.stackexchange.com/그 대신하여 두 번째는 지역 변수라는 이름 지수
를 극대화를 읽고 이해도(최소한의 런타임 비용이 너무,I 참고):
var index = someArray.indexOf( 3 );
var value = index == -1 ? 0 : index;
그러나 만약 당신이 정말로 원하는 이 표현기 때문에,당신은 당'다시는 잔인한 사 디스트를 동료 또는 프로젝트에 공동 작업자,그리고 여기에 4 에 접근할 수 있 사용:
사용할 수 있습니다 var 문이's 을 정의하는 기능(및 할당)두 번째 변수인덱스
때는 쉼표로 구분:
var index = someArray.indexOf(3), value = index !== -1 ? index: 0;
또 다른 옵션은 셀프-실행하는 익명의 기능:
// Traditional syntax:
var value = function( x ) { return x !== -1 ? x : 0 }( someArray.indexOf(3) );
// ES6 syntax:
var value = ( x => x !== -1 ? x : 0 )( someArray.indexOf(3) );
거기에도 악"쉼표자"JavaScript 지원은 또한에서 존재하는 C 및 C++.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator
사용할 수 있는 쉼표는 운영자 포함하려면 여러 표현이는 위치에 단일 식입니다.
당신은 그것을 사용할 수 있습을 소개하는 부작용,이 경우 다시 할당하여하는value
:
var value = ( value = someArray.indexOf(3), value !== -1 ? value : 0 );
이 작품이기 때문에var 값을
해석됩니다 첫 번째는(그's statement),and다음가장 왼쪽,가장 안쪽value
할당,다음 오른쪽의 쉼표 연산자,그리고 다음은 원산-모든 법적 JavaScript.
해설자@IllusiveBrian 지적 사용의 쉼표자(이전 예에서)가 불필요한 경우에는 할당을value
로 사용되는 괄호로 묶인 부분식:
var value = ( ( value = someArray.indexOf(3) ) !== -1 ? value : 0 );
주의 사용을 제외에서는 논리적 표현이 될 수 있다 더 열심히 인간을 따르-그래서 모든 위의 예에는 간소화할 수 있습니다 읽기 위해 변경하여idx!== -1? x:y
에서idx==-1? y:x
:
var value = ( ( value = someArray.indexOf(3) ) == -1 ? 0 : value );
숫자
사용할 수 있는수학이다.max()
기능이 있습니다.
var value = Math.max( someArray.indexOf('y'), 0 );
을 유지합니다계의 결과에서0
때까지 첫 번째 결과는 더 이상0
는 경우에는's 니다. 는 경우 그 결과에서 indexOf
이 -1가 반환됩니다 0 으로 보다 큰
-1`.
부울에 대한 고 boolean-y 값
에 대한 JS 일반적인 규칙은 없 AFAIK 기 때문에 특별히는 방법falsy값이 계산됩니다.
그러면 당신을 도울 수 있는 대부분의 시간입니다 또는 사업자(||
):
// Instead of
var variable = this_one === true ? this_one : or_this_one;
// you can use
var variable = this_one || or_this_one;
당신은 매우 조심이기 때문에,당신의 첫 번째 예를 들어,indexOf
수익0
그리고 만약 당신이 평가0||-1
가 반환됩니다-1
기 때문에0
는falsy값입니다.
지 사용,다른 변수가 있습니다.
귀하의 예를 총괄하는 일이 없습니다.
var x = predicate(f()) ? f() : default;
You'다시 테스트 계산된 값을 할당하는 변수에 값을 전달 하는 경우 몇 가지 조건이 있습니다. 하는 것을 방지하기 위해 다시 계산 계산 값은 분명:변수를 사용하여 결과를 저장합니다.
var computed = f();
var x = predicate(computed) ? computed : default;
내가 무엇을 의미하는 것이 가장 해야하는 몇 가지 방법이 조금 보이는 청소기입니다. 그러나 내가 생각하는's 는 최고의 방법(관용구)이 작업을 수행 할 수 있습니다. 었다면 이것을 반복 패턴 많은 코드에서 어떤 이유로,다음과 같이 작성할 수 있습니다 작은 도우미 기능:
var setif = (value, predicate, default) => predicate(value) ? value : default;
var x = setif(someArray.indexOf(3), x => x !== -1, 0)
용||
const result=a? a:'대체 가치';
에 해당하는
const result=a||'대체 가치';
는 경우**주의Boolean
반환false
,`결과에 할당
'대체 가치',그렇지 않으면 값의
a`.
알고 있어야의 가장자리의 경우a===0
캐스팅하는false
및가 발생하는 것(잘못)가
'대체 가치'`. 트릭을 사용하여 다음과 같이 당신의 자신의 위험이 있습니다.
PS. 언어와 같이 스위프트가nil-통합통신수(??
), 제공하는 유사한 목적입니다. 예를 들어,스위프트를 쓰는 것이결과=a?? "대체 가치"
는 아주 가까이 JavaScript'sconst result=a||'대체 가치';
사용하는추출 변수 refactoring:
var index = someArray.indexOf(3);
var value = index !== -1 ? index : 0
그것은 더 나은const
대신에var
. 당신은 또한 할 수 있는 추가적인 추출:
const index = someArray.indexOf(3);
const condition = index !== -1;
const value = condition ? index : 0;
실제로,더 많이 사용하는 의미있는 이름보다는인덱스
,상태
,그리고value
.
const threesIndex = someArray.indexOf(3);
const threeFound = threesIndex !== -1;
const threesIndexOrZero = threeFound ? threesIndex : 0;
나 개인적으로 선호하는 두종류:
순수한 경우,다음과 같@slebetman 제안
별도의 함수를 대체하는 잘못된 값이 기본값으로 하나,같은 이 예에서는 다음과 같습니다.
function maskNegative(v, def) {
return v >= 0 ? v : def;
}
Array.prototype.indexOfOrDefault = function(v, def) {
return maskNegative(this.indexOf(v), def);
}
var someArray = [1, 2];
console.log(someArray.indexOfOrDefault(2, 0)); // index is 1
console.log(someArray.indexOfOrDefault(3, 0)); // default 0 returned
console.log(someArray.indexOfOrDefault(3, 123)); // default 123 returned
You'다시 찾고 아마에 대한 통합 운영자입니다. 다행히도,우리가 활용할 수 있는배열
프로토타입을 하나씩 만들:
Array.prototype.coalesce = function() {
for (var i = 0; i < this.length; i++) {
if (this[i] != false && this[i] != null) return this[i];
}
}
[null, false, 0, 5, 'test'].coalesce(); // returns 5
이 더욱 일반화하여 귀하의 경우,추가하여 매개 변수 기능:
Array.prototype.coalesce = function(valid) {
if (typeof valid !== 'function') {
valid = function(a) {
return a != false && a != null;
}
}
for (var i = 0; i < this.length; i++) {
if (valid(this[i])) return this[i];
}
}
[null, false, 0, 5, 'test'].coalesce(); // still returns 5
[null, false, 0, 5, 'test'].coalesce(function(a){return a !== -1}); // returns null
[null, false, 0, 5, 'test'].coalesce(function(a){return a != null}); //returns false
나는 다음과 같@slebetman's answer. 코멘트의 밑에 그것에 대해 우려되는 변수에서"중간 상태". 이것은 큰 문제가 당신을 위해 그 내 건의 캡슐화에 기능:
function get_value(arr) {
var value = arr.indexOf(3);
if (value === -1) {
value = 0;
}
return value;
}
그런 다음 전화
var value = get_value( someArray );
당신이 할 수 있는 더 일반적인 기능이 있는 경우에 사용하는 다른 장소에서 그들지만,don't 통해 엔지니어 경's 는 아주 특정한 경우입니다.
그러나 솔직히 말해서 나는 그냥 그렇게로@slebetman 지 않으면 내가 필요로 다시 사용하여 여러 가지 장소입니다.
거기에는 두 가지 방법으로 볼 수 있습을 보는 귀하의 질문:중 하나를 당신을 감소시키고 싶라인 길이,또는 당신은 특히 피하려고 반복되는 변수에서 삼. 첫 번째 사소한(그리고 많은 다른 사용자가 게시한 예):
var value = someArray.indexOf(3) !== -1 ? someArray.indexOf(3) : 0;
가 될 수 있습니다(해야한,주어진 함수 호출의)단축 그래서 다음과 같:
var value = someArray.indexOf(3);
value = value !== -1 ? value : 0;
만약 당신이 찾고 보다 일반적인 솔루션을 방지하는 반복의 변수에서 원래와 같은:
var value = conditionalTest(foo) ? foo : bar;
여기서foo
만 한 번 나타납니다. 폐기 솔루션의 형태로 되어 있습니다.
var cad = foo;
var value = conditionalTest(foo) ? cad : bar;
으로 기술적으로 정확하지만 누락된 지점,당신은 행운입니다. 거기에는 연산자,기능 및 방법을 소유하는 간결한 구문을 구하지만,그러한 구문,의 정의하지 않는'tternary operators.
예제:
자바스크립트,사용하는||
로 돌아 RHS 때 LHS 은falsey
:
var value = foo || bar; // equivalent to !foo ? bar : foo
사용하는 도우미 기능:
function translateValue(value, match, translated) {
return value === match ? translated : value;
}
지금 당신의 코드는 아주 읽기와 있's 없이 반복되고있다.
var value = translateValue(someArray.indexOf(3), -1, 0);
이 계층의 코딩의 관심사입니다:
모든 응답이 페이지에서 지금까지 나타나 올바르지만 나는 내가 가장 높은 선명도,이보다 더 중요한 간결함. 지 않는 경우't count 도우미 기능으로 다시 사용할 수 있습니다—그것은 가장 간단하고 뿐만 아니라. 소와 비슷한 제안을 사용하여 도우미 기능을 불행하게도를 사용하는 람다,나에게,그냥 가린 것's 하고있다. 간단한 기능을 가진 하나의 목적지 않는't 을 람다,그 값은 나에게 훨씬 더 낫습니다.
P.S. 는 경우 다음과 같 ES6syntax:
const translateValue = (value, match, translated) => value === match ? translated : value;
let value = translateValue(someArray.indexOf(3), -1, 0); // or const
이것은 간단한 솔루션으로[비트 NOT](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT 다)및 기본값은-1
는 결과를 나중에 제로입니다.
index = ~(~array.indexOf(3) || -1);
그것은 작품은 기본적으로 더블 비트지 않습니다,원래 값을 반환합니다 또는 기본 값을 적용한 후 비트지 않을 반환합니다.
Let's 보 테이블의 진실:
indexOf~indexOf boolean 기본값 결과 코멘트
-1 0 falsy -1 -1 0 take default value
0 -1 truthy -1 0
1 -2 truthy -2 1
2 -3 truthy -3 2
당신이 사용할 수 있습 re-지정:
초기화 값 변수
-사용의 직렬화&&
운영자를 위해 재배하기 때문에,경우의 첫 번째 조건이 거짓,두 번째는 식지 않't 평가
Ex.
var value = someArray.indexOf(3);
value == -1 && (value=0);
var someArray = [4,3,2,1];
var value = someArray.indexOf(1);
value == -1 && (value=0);
console.log('Found:',value);
var value = someArray.indexOf(5);
value == -1 && (value=0);
console.log('Not Found:',value);
이를 위해 특정한 경우,사용할 수 있습의 단락으로 논리적인||
연산자입니다. 0
으로 간주됩 falsy,당신이 할 수 있는+1
는 인덱스에 따라서,이 경우index+1``0
그럼 당신이'을 얻을 것이 오른쪽의 반환으로 당신의 결과,그렇지 않으면,당신은 당'을 얻을 것이의index+1
. 할 수 있습니다 다음-1 은
에서 이 결과를 얻을 당신의 색인:
const someArray = [1, 2, 3, 4];
const v = ((someArray.indexOf(3)+1) || 1)-1;
console.log(v);
주어진 예제 코드에서 질문을 명확하지 않을 것 어떻게 결정하는3
를 설정하지 않거나 인덱스0
의someArray
. -1
에서 돌아.indexOf()
는 것에서 중요한 것이 인스턴스에 대한의 목적을 제외한 추정된 비치 될 수있는 일치합니다.
면3
에 포함되지 않은 배열,-1
이 반환됩니다. 우리를 추가할 수 있는1
을 결과.indexOf()
로 평가하는false
결과에 대한되는-1
,는 다음에||``또는
연산자0
. 을 때value
참조,빼1
을 얻을 인덱스의 요소를 배열 또는-1
.
에 이르는 다시 단순히 사용하는.indexOf()
확인에 대한 -1
에서는만약에
상태입니다. 또는,정의value
으로정의되지 않은
가능성을 피하기 위해 혼란으로 실제 결과의 평가되는 조건과 관련된 원래 참조.
var someArray = [1,2,3];
var value = someArray.indexOf(3) + 1 || 1;
console.log(value -= 1);
var someArray = [1,2,3];
var value = someArray.indexOf(4) + 1 || 1;
// how do we know that `4` is not at index `0`?
console.log(value -= 1);
var someArray = [1,2,3];
var value = someArray.indexOf(4) + 1 || void 0;
// we know for certain that `4` is not found in `someArray`
console.log(value, value = value || 0);