AND 여러 매개 변수


15
function andMultipleExpr(){
  let logicalAnd;
  let i;
  for (i = 0; i < arguments.length; i++){
    logicalAnd =  arguments[i] && arguments[i+1];
  }
  return logicalAnd;
}

console.log(andMultipleExpr(true, true, false, false));

내가 기대하는 것은이 코드를 실행하는 것입니다 : true && true && false && false 그리고 그것은 false 를 반환해야합니다 .

js에서 어떻게 작동하게합니까? 감사


그냥 망설이고 있어요. 내 아이디어가 잘 정리되어 있는지 확인하고 싶습니다. 더 좋은 방법이 있다면 제안하십시오.
Hakim Asa

부울 대신 Troothy 값을 사용하면 어떤 결과가 나오나요? 즉 andMultipleExpr(1, 1, 0, 0)또는andMultipleExpr(1, 1, 1, 1)
nick zoum

또한 andMultipleExpr()(매개 변수없이 함수 호출) 의 결과는 무엇 입니까?
nick zoum

물론 그러한 경우도 고려해야합니다. :-)
Hakim Asa

답변:


16

Array.prototype.every전달 된 모든 인수에 사용 하여 모두 인수인지 확인하십시오.

function andMultipleExpr(...a) {
  if(a.length === 0) return false; // return false when no argument being passed
  return a.every(Boolean);
}

console.log(andMultipleExpr(true, true, false)); // should return false
console.log(andMultipleExpr(true, true, true)); // should return true


다음으로 대체 가능 e => e === true:Boolean
nick zoum

@nickzoum 이것은 모든 진실한 가치와 일치 할 것이며, OP는 엄격하게 비교하고 true있습니다.
Archie

1
@Archie-아니요, 진실 / 거짓을 비교하고 있습니다. ===OP의 코드 에는 없습니다 . 너의every그래도 아이디어는 자리에 있습니다. 그러나 .every(e => e)그 일만합니다.
TJ Crowder

@TJCrowder 네, 방금 주목했습니다. 답변을 이미 업데이트했습니다. 감사합니다 :)
Archie

도우미 함수를 추가하면 const isTrue = x => x === true(또는 x => !!x모든 진실한 값에 대해) 솔루션을로 압축 할 수 있습니다 return arguments.every(isTrue). 나에게 아름다운 것 같습니다.
mbojko

9

당신은 필요

  1. logicalAnd설정하여 시작true

  2. logicalAnd두 항목을 사용하지 않고 업데이트 할 때 사용arguments

최소한의 변화는 다음과 같습니다.

function andMultipleExpr(){
    let logicalAnd = true; // ***
    let i;
    for (i = 0; i < arguments.length; i++){
        logicalAnd = logicalAnd && arguments[i]; // ***
    }
    return logicalAnd;
}
console.log(andMultipleExpr(true, true, false, false));

그러나 mbojko의 솔루션 은 단락의 장점이 있습니다 (처음 잘못된 값을 발견하면 루프를 중지). 이는 좋은 생각입니다.

ES2015 +를 사용하고 있으므로 아마 rest 매개 변수를 사용해야합니다 arguments 를 사용해야하며 for-of루프를 사용할 수 있습니다 .

function andMultipleExpr(...flags) {
    let logicalAnd = true;
    for (const flag of flags) {
        logicalAnd = logicalAnd && flag;
    }
    return logicalAnd;
}
console.log(andMultipleExpr(true, true, false, false));

mbojko의 접근 방식 에 따라 단락시킬 수도 있습니다.

function andMultipleExpr(...flags) {
    for (const flag of flags) {
        if (!flag) {
            return false;
        }
    }
    return true;
}
console.log(andMultipleExpr(true, true, false, false));

어떤 사람들은 reduce이것을 던질 수도 있지만 Archie의 every솔루션 이 훨씬 좋습니다. (그러나 비교가 엄격하지 않기 때문에 그냥 만들 것입니다..every(flag => flag) 입니다.)


1
감사. 그것은 나에게 더 의미가 있습니다 :-)
Hakim Asa

이 경우 reduce 문에 두 번째 매개 변수를 추가 할 필요가 없으며 기본적으로 첫 번째 매개 변수를 얻는 것도 효과가 있습니다.
nick zoum

1
@nickzoum-던지기 때문에 함수가 인수없이 호출되지 않는다고 가정 할 수있는 경우에만 해당됩니다 [].reduce((a,b)=>a && b).
TJ Crowder

6

초기 반품은 코드를보다 효율적이고 짧게 만들어야합니다.

function andMultipleExpr() {
  for (let i = 0; i < arguments.length; i++) {
    if (!arguments[i]) {
      return false;
    }
  }

  return true;
}

4

나는 이것이 ES6을 사용 하는 매우 짧은 방법 이라고 생각합니다. Array.prototype.reduce

let andMultipleExpr = (...args) => args.reduce((a, b) => a && b);

console.log(andMultipleExpr(true, true, false, false));

기능 축소에 대한 자세한 내용은 MDN을 참조하십시오


당신이 배열 방법을 사용하고 있다면, 그건 많이 사용하는 것이 좋습니다 every처럼 아치했던 것보다 reduce. 더 간단하고 단락됩니다.
TJ Crowder

그건 진실이야. 그러나 지금 우리가 원하지만 LOGICAL OR || 이제 reduce로 && ||
Patrissol Kenfack

또는 everysome. 여전히 간단합니다. 여전히 단락.
TJ Crowder

잘 했어. 당신은 맞습니다 @TJCrowder
Patrissol Kenfack

3

당신은 걸릴 수 있습니다 Array#every마지막 값을 반환 .

이 접근법은 논리 AND 의 실제 결과를 반환합니다.&& .

이 접근 방식을 사용하면 처음 발견 된 잘못된 값에 대해 단락이 발생합니다. 그런 다음 반복이 중지됩니다.

function andMultipleExpr(...args) {
    var result; // any return value is configurable for empty args
    args.every(v => result = v);
    return result;
}

console.log(andMultipleExpr(true, true, false, false));
console.log(andMultipleExpr(true, true, 1, 2));
console.log(andMultipleExpr(true, 0, 1, 2));


3

아마도 루프에서 무엇이 잘못되었는지 듣고 싶을 것입니다.

for (i = 0; i < arguments.length; i++){
  logicalAnd =  arguments[i] && arguments[i+1];
}
  1. 이 루프는 &&마지막 두 항목 중 마지막 항목을 저장합니다 . 이상적인 경우 &&배열의 마지막 두 요소 (함께 필요하지 않은 요소)를 함께 묶을 수 있습니다.
  2. 루프의 끝에서 그 위에 i=arguments.length-1배열의 마지막 요소를 검사하고 마지막 요소 인 i+1"뒤"요소입니다 undefined. 논리적 관계 측면에서는 고려 false되지만 &&이러한 경우 값 자체를 생성하므로 함수가 undefined항상 반환 하는 이유입니다 (문제에서 언급했을 수 있음).

문서

expr1 && expr2: expr1로 변환 할 수 있으면를 true반환합니다 expr2. 그렇지 않으면를 반환합니다 expr1.

arr=[true];
console.log("your case:",arr[0] && arr[1]);

console.log("1 && 2:", 1 && 2);


대신, 모든 이전 요소 logicalAnd의 결과를 수집하는 누적 기 (accumulator)로 사용해야 하며 &&, 부분 결과가 다음과 같은 경우 사용할 수있는 트릭 &&입니다.false , 그것은 나머지 요소가 무엇인지 중요하지 않습니다, 최종 결과 될 것입니다 false루프를 즉시 중지 할 수 있습니다 :

function andMultipleExpr(){
    let logicalAnd = arguments[0] || false;
    for (let i = 1; i < arguments.length && logicalAnd; i++){
        logicalAnd = logicalAnd && arguments[i];
    }
    return logicalAnd;
}

console.log("():",andMultipleExpr());
console.log("(false):",andMultipleExpr(false));
console.log("(true):",andMultipleExpr(true));
console.log("(true,true):",andMultipleExpr(true,true));
console.log("(true, true, false, false):",andMultipleExpr(true, true, false, false));

그런 다음 Archie의 답변 으로 최적화 할 수 있습니다 . &&-ing 항목 의 결과는 true모든 항목이 인 경우이며 결과 계산을 위해 true단일 &&작업 을 실행할 필요가 없습니다 .

function andMultipleExpr(){
    if(arguments.length===0){
      return false;
    }
    for (let i = 0; i < arguments.length; i++){
      if(!arguments[i]){
        return false;
      }
    }
    return true;
}

console.log("():",andMultipleExpr());
console.log("(false):",andMultipleExpr(false));
console.log("(true):",andMultipleExpr(true));
console.log("(true,true):",andMultipleExpr(true,true));
console.log("(true, true, false, false):",andMultipleExpr(true, true, false, false));

(위의 스 니펫에서는 false빈 인수 목록 을 작성하는 것을 목표로했습니다 .)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.