Convertir les opérateurs conditionnels ternaires en déclarations if?

Avec un code minifié qui ressemble à ceci,

f&&!f.error?k.button.b==k.button.cG?k.button.Q(b,e,f,c,d):k.button.b==k.button.co&&k.button.P(b,e,f,c,d):(console.error(f),f=f.error.message||chrome.i18n.getMessage("error_tooltip"),k.button.v(b.id,f),d({action:"error"})) 

Existe-t-il un outil automatisé qui peut transformer cette ligne d'opérateurs conditionnels en une série de déclarations if?

Exemple 1:

De

 (i < 0 ? function1() : function2()) 

à

 if (i < 0) { function1(); } else { function2(); } 

Exemple 2:

De

 (i < 0 ? function1() : (i === 0 ? function2() : function3())) 

à

 if (i < 0) { function1(); } else { if (i === 0) { function2(); } else { function3(); } } 

De

 f&&!f.error?k.button.b==k.button.cG?k.button.Q(b,e,f,c,d):k.button.b==k.button.co&&k.button.P(b,e,f,c,d):(console.error(f),f=f.error.message||chrome.i18n.getMessage("error_tooltip"),k.button.v(b.id,f),d({action:"error"})) 

à

 if (f && !f.error) { if (k.button.b == k.button.cG) { k.button.Q(b, e, f, c, d) } else { k.button.b == k.button.co && k.button.P(b, e, f, c, d) } } else { (console.error(f), f = f.error.message || chrome.i18n.getMessage("error_tooltip"), k.button.v(b.id, f), d( { action: "error" })) } 

En utilisant ce (et ensuite JSBeautifier):

 /*jslint browser: true, vars: true, white: true, maxerr: 50, indent: 4 */ (function (console) { "use strict"; function transform(string) { var questionMark = string.indexOf("?"); var colon = string.indexOf(":", questionMark); if (questionMark === -1 || colon === -1) { return string; } var condition = string.substring(0, questionMark); var expressions = string.substring(questionMark + 1, string.length); var trueExpression = null; var falseExpression = null; console.log("expressions: " + expressions); // While looking in pairs, find the location where the colon occurs before the question mark. questionMark = expressions.indexOf("?"); colon = expressions.indexOf(":"); while ((questionMark !== -1 && colon !== -1) && (questionMark < colon)) { questionMark = expressions.indexOf("?", questionMark + 1); colon = expressions.indexOf(":", colon + 1); } console.log("\t" + "questionMark: " + questionMark); console.log("\t" + "colon: " + colon); trueExpression = expressions.substring(0, colon); falseExpression = expressions.substring(colon + 1, expressions.length); console.log("condition: " + condition); console.log("trueExpression: " + trueExpression); console.log("falseExpression: " + falseExpression); console.log("-"); return ("if (" + condition + ") {\n" + transform(trueExpression) + "\n} else {\n" + transform(falseExpression) + "\n}"); } function unittest() { console.log(transform("(i < 0 ? function1() : function2())")); console.log("---"); console.log(transform("i < 0 ? function1() : function2()")); console.log("---"); console.log(transform("i < 0 ? function1() : i === 0 ? function2() : function3()")); console.log("---"); console.log(transform("i > 0 ? i === 1 ? function1() : function2() : function3()")); console.log("---"); console.log(transform("i > 0 ? i === 1 ? function1() : i === 2 ? function2() : function3() : function4()")); console.log("---"); console.log(transform("i > 0 ? i === 1 ? function1() : i === 2 ? function2() : function3() : i === 0 ? function4() : function5()")); console.log("---"); console.log(transform("f&&!f.error?k.button.b==k.button.cG?k.button.Q(b,e,f,c,d):k.button.b==k.button.co&&k.button.P(b,e,f,c,d):(console.error(f),f=f.error.message||chrome.i18n.getMessage(\"error_tooltip\"),k.button.v(b.id,f),d({action:\"error\"}))")); } unittest(); }(window.console)); 

Babel-plugin-transform-ternary-to-if-else

Je ne sais pas si c'est trop tard, cette question a cinq ans après tout.

J'ai rencontré exactement le même problème hier et j'ai réussi à mettre en place un plugin babel pour transformer les expressions conditionnelles en déclarations if-else. Il a un nom plutôt simple: babel-plugin-transform-ternary-to-if-else

Important: j'ai dit des expressions et des déclarations , nous les reverrons plus tard.

Exemples

Ici, je prends les deux exemples de code comme entrée et je les exécute avec le plugin.

 // case 0: input (i < 0 ? function1() : function2()) // case 0: output (function () { if (i < 0) { return function1(); } return function2(); })(); // case 1: input (i < 0 ? function1() : (i === 0 ? function2() : function3())) // case 1: output (function () { if (i < 0) { return function1(); } return function () { if (i === 0) { return function2(); } return function3(); }(); })(); 

Génial?

Vous pouvez penser: Mmmm … Pas tellement. Qu'y a-t-il avec toutes ces IIFE (expressions de fonction immédiatement appelées) ?

IIFEs

IIFE est réellement nécessaire. Parce que, comme je l'ai dit au début, une expression conditionnelle est une expression, une instruction if est une déclaration.

Une expression peut faire partie d'une déclaration, c'est sûr. Mais une déclaration peut-elle faire partie d'une autre déclaration? Non, il ne peut pas, à moins d'être enveloppé dans un IIFE .

Bien sûr, en tant que cas spécial, une déclaration d'expression simple peut être remplacée par une autre instruction if, par exemple a1() ? a2() : a3(); a1() ? a2() : a3(); Peut être remplacé par if (a1()) {a2();} else {a3();} . Mais cela ne peut s'appliquer à tous les cas.

Donc, nous sommes ici, IIFE.

L'avenir

Les bonnes nouvelles sont, lorsque la proposition de faire des propositions en fait dans la spécification ECMAScript, nous irons sans la verbosité des IIFE.

En fait, babel-plugin-syntax-do-expressions transforme les expressions en expressions conditionnelles , ce qui signifie qu'elles sont le remplacement exact de l'autre .

Des liens

Babel-plugin-transform-ternary-to-if-else

Faire une proposition d'expressions

Babel-plugin-syntax-do-expressions