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値が使用された場合の出力は何ですか?ie andMultipleExpr(1, 1, 0, 0)またはandMultipleExpr(1, 1, 1, 1)
ニックゾーム

また、andMultipleExpr()(パラメータなしで関数を呼び出す)の出力はどうあるべきですか?
ニックゾーム

まあ、それらのケースも考慮に入れる必要があります。:-)
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 === trueBoolean
ニックzoum

@nickzoumこれはすべての真の値に一致します。OPは厳密に比較していtrueます。
Archie

1
@Archie-いいえ、彼らは真実/偽物を比較しています。===OPのコードには何もありません。あなたのeveryアイデアは、しかし、スポットです。しかし.every(e => e)、仕事はします。
TJクラウダー

@TJCrowderはい、気づきました。答えはすでに更新されています。ありがとう:)
Archie

ヘルパー関数を追加する場合:(const isTrue = x => x === trueまたはx => !!xすべての真の値に対して)、ソリューションをに圧縮できますreturn arguments.every(isTrue)。私にとってはどれも美しいようです。
mbojko

9

必要がある

  1. logicalAnd設定して開始true

  2. logicalAndからの2つのエントリを使用するのではなく、更新時に使用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これを思い付くeveryかもしれませんが、アーチーの解決策ははるかに優れています。(しかし、あなたの比較は厳密ではないので、私はそれを作ります.every(flag => flag)。)


1
ありがとう。それは私にはもっと理にかなっています:-)
Hakim Asa

この場合、reduceステートメントに2番目のパラメーターを追加する必要はありません。デフォルトで最初のパラメーターを取得することもできます。
ニックゾーム

1
@nickzoum-がスローされるため、関数が引数なしで呼び出されることはないと想定できる場合のみ[].reduce((a,b)=>a && b)
TJクラウダー

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クラウダー

それは本当です。しかし、私たちは今、彼が望んでいるが、滞在させ、論理OR || さて、reduceを使用すると、&&||に
Patrissol Kenfack

またはeverysome。まだ簡単です。まだ短絡しています。
TJクラウダー

よくやった。あなたは正しい@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つのアイテムのを保存します。理想的なケースでは&&、配列の最後の2つの要素を一緒にします(これはすでに必要なものではありません)。
  2. その上で、ループi=arguments.length-1の最後で、配列の最後の要素をチェックします。i+1これは、最後の要素の「後」の要素ですundefined。論理関係の観点からは、と見なされますが、そのような場合は値自体false&&生成されます。そのため、関数はundefined常に戻ります(これは質問で言及されている可能性があります)。

文書

expr1 && expr2expr1に変換できる場合はtrue、を返しますexpr2。それ以外の場合はを返しますexpr1

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

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


代わりに、あなたは使うべきlogicalAnd結果を収集アキュムレータとして、&&以前のすべての要素を-ingを、あなたが使用することができますどのようなトリックは、部分的な結果は次の場合で&&ある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.