Преобразовать троичные условные операторы в операторы if? - PullRequest
4 голосов
/ 17 января 2012

С уменьшенным кодом, который выглядит следующим образом:

f&&!f.error?k.button.b==k.button.c.G?k.button.Q(b,e,f,c,d):k.button.b==k.button.c.o&&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?

Пример 1:

С

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

до

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

Пример 2:

С

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

до

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

Ответы [ 2 ]

9 голосов
/ 17 января 2012

От

f&&!f.error?k.button.b==k.button.c.G?k.button.Q(b,e,f,c,d):k.button.b==k.button.c.o&&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.c.G)
    {
        k.button.Q(b, e, f, c, d)
    }
    else
    {
        k.button.b == k.button.c.o && 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"
    }))
}

с использованием этого (а затем 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.c.G?k.button.Q(b,e,f,c,d):k.button.b==k.button.c.o&&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));
1 голос
/ 12 мая 2017

babel-plugin-transform-ternary-to-if-else

Не знаю, уже слишком ли поздно, этому вопросу пять лет.

Я побежалВ ту же проблему вчера, и ему удалось установить плагин babel для преобразования условных выражений в операторы if-else.У него довольно простое имя: babel-plugin-transform-ternary-to-if-else

Важно: я сказал выражений и заявления , мы вернемся к ним позже.

Примеры

Здесь я беру два примера кода в качестве ввода и запускаю их с плагином.

// 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();
  }();
})();

Отлично?

Вы можете подумать: Мммм ... Не так уж и много.Что со всеми этими IIFE (выражениями немедленного вызова функций) ?

IIFEs

IIFE действительно необходимы.Потому что, как я говорил в начале, условное выражение - это выражение, оператор if - это оператор.

Выражение может быть частью оператора, это точно.Но может ли утверждение стать частью другого утверждения? Нет, не может, если не обернут внутри IIFE .

Конечно, в качестве особого случая простое выражение выражения может быть заменено другим оператором if, например, a1() ? a2() : a3(); может быть замененос if (a1()) {a2();} else {a3();}.Но это не может относиться ко всем случаям.

Итак, вот мы, IIFE.

Будущее

Хорошая новость заключается в том, когда выражения делаютПредложение сделайте это в спецификации ECMAScript, мы пойдем без многословия IIFE.

Фактически, babel-plugin-syntax-do-expressions transforms do выраженияв условные выражения , что означает точную замену друг другу .

Ссылки

babel-plugin-transform-ternary-to-if-else

предложение предложений выражений

babel-plugin-syntax-do-expressions

...