13 votes

ET plusieurs paramètres

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));

Ce que j'attends, c'est l'exécution de ce code : true&&true&&false&&false et qui devrait renvoyer faux .

Comment faire pour que cela fonctionne en js ? Merci d'avance pour votre réponse.

15voto

Archie Points 893

Utilice Array.prototype.every sur tous les arguments passés pour vérifier s'ils sont tous vrais ;

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

8voto

T.J. Crowder Points 285826

Vous devez

  1. Commencez par logicalAnd fixé à true

  2. Utilice logicalAnd lors de sa mise à jour, plutôt que d'utiliser deux entrées de arguments

Le changement minimal est le suivant :

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));

Mais La solution de mbojko a l'avantage de court-circuiter (arrêter la boucle dès qu'elle trouve une valeur erronée), ce qui semble être une bonne idée.

Puisque vous utilisez ES2015+, vous devriez probablement utiliser un paramètre rest plutôt que arguments et vous pouvez utiliser un for-of boucle :

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

Vous pouvez également le court-circuiter en suivant les instructions suivantes L'approche de mbojko

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

Certaines personnes pourraient jeter reduce à cela, mais Archie's every solution est bien meilleure. (Mais comme votre comparaison n'est pas stricte, je me contenterais de la faire .every(flag => flag) .)

5voto

mbojko Points 9720

Les premiers retours devraient rendre le code plus efficace et plus court :

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

  return true;
}

3voto

Patrissol Kenfack Points 478

Je pense qu'il s'agit d'une chemin court en utilisant ES6 Array.prototype.reduce

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

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

Pour plus d'explications sur la fonction de réduction, veuillez lire MDN

2voto

Nina Scholz Points 17120

Vous pouvez prendre Array#every et renvoie la dernière valeur.

Cette approche permet d'obtenir le résultat réel de ET logique && .

En utilisant cette approche, un court-circuit est réalisé pour la première valeur erronée trouvée. L'itération s'arrête ensuite.

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));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X