【问题标题】:remove redundant code in method删除方法中的冗余代码
【发布时间】:2016-08-02 14:06:25
【问题描述】:

我正在使用以下代码,但在阅读了关于 JS(我相当新)之后,我注意到了 3 件事。

  1. 在方法开头使用return

  2. 使用ternary条件(不知道在这种情况下如何使用)

  3. 使用reduce(对此不确定,但可能代替forEach)

是否可以在下面的代码中使用它?

 get: function(document, oData) {
        var self = this;
        var oInnerHTML;
        if (oData) {
            var oParsedHTML = this._parseHtml(document);
            oInnerHTML = oParsedHTML;
            oData.forEach(function(configEntry) {
                oInnerHTML = self._routeExtentionTypes(configEntry, oInnerHTML);
            });
            oInnerHTML = this._convertBackToHtml(oInnerHTML);
        } else {
            oInnerHTML = document;
        }
         return oInnerHTML
    }

代码在做什么

  1. 获取 HtmlString 并解析它
  2. 根据cofigEntry和原HTML进行扩展
  3. 完成配置条目后,它会转换回 HTML

【问题讨论】:

  • self._routeExtentionTypes(configEntry, oInnerHTML); 在做什么?
  • @NinaScholz - 这会返回一个扩展的 HTML,输入是 configEntry,它是对象数组的实例,oInnerHTML 是我发送并返回扩展 HTML 的原始 html
  • @NinaScholz - 它回答了你的问题吗?

标签: javascript jquery mapreduce ternary-operator


【解决方案1】:

在方法开头使用return

当您的对象准备好所需的值时,请使用 return。尽早返回是一个好习惯。这样,最少的代码被执行和评估。

在上面的示例中,“oInnerHTML”变量在满足某些条件的情况下准备好值,因此在这种情况下,您可以在对象/变量准备好值后立即返回它。

使用三元条件

当您基于一个简单的条件为变量赋值或者您正在做出具有非常简短结果的多个决策时,三元运算符很常见。例如

x ? y: z

在上面的例子中,三元运算符可以如下使用:(请执行代码并仔细检查)

get: function(document, oData) {
  var self = this;      
  return (oData) ? document : get_oInnerHTML(oData);
}      

function get_oInnerHTML (oData){
  var oInnerHTML;
  oData.forEach(function(configEntry) { oInnerHTML = self._routeExtentionTypes(configEntry, this._parseHtml(document)); });
  return oInnerHTML;
}  

以上代码在三元条件下使用了一个函数。由于有很多行需要在条件内执行,所以我为它创建了单独的函数并在条件下使用。

使用reduce

reduce() 方法对累加器和数组的每个值(从左到右)应用一个函数,以将其减少为单个值。

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, currentIndex, array) { return previousValue + currentValue; });

【讨论】:

    【解决方案2】:

    我想,你可以试试Array#reduce()。

    基本上,reduce 正在做你想做的事。它需要一个起始值并迭代一个数组并根据需要返回一些值。

    以前的代码

    var oParsedHTML = this._parseHtml(document);
        oInnerHTML = oParsedHTML;
    oData.forEach(function(configEntry) {
        oInnerHTML = self._routeExtentionTypes(configEntry, oInnerHTML);
    });
    

    转换为

    this._convertBackToHtml(oData.reduce(function (r, configEntry) {
        return self._routeExtentionTypes(configEntry, r);
    }, this._parseHtml(document))) :
    

    因为现在开始值是this._parseHtml(document),不需要额外的变量,并且返回值成为下一次迭代的新输入值。

    get: function (document, oData) {
        var self = this;
        return oData ?
            this._convertBackToHtml(oData.reduce(function (r, configEntry) {
                return self._routeExtentionTypes(configEntry, r);
            }, this._parseHtml(document))) :
            document;
    }
    

    【讨论】:

    • 谢谢,我现在就试试,顺便说一句,我用更多关于代码在做什么的信息更新了这个问题......
    • 谢谢,这似乎是工作 1+!我现在进一步检查它,两个问题:) 1. 如果我删除三元代码,代码的样子(有点难以理解)2。你能解释一下你的代码吗?
    • 跳过三进制,如果你确定 oData 总是 thruthy,然后返回 this._convertBackToHtml(oData.reduce(function (r, configEntry) { return self._routeExtentionTypes(configEntry, r); }, this._parseHtml(document)));
    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多