[javascript] AND 여러 매개 변수

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에서 어떻게 작동하게합니까? 감사



답변

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


답변

당신은 필요

  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) 입니다.)


답변

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

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

  return true;
}


답변

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

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

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

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


답변

당신은 걸릴 수 있습니다 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));


답변

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

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빈 인수 목록 을 작성하는 것을 목표로했습니다 .)


답변