【问题标题】:How to simplify / streamline this code? (Object check into function call)如何简化/精简此代码? (对象检入函数调用)
【发布时间】:2016-01-30 05:58:19
【问题描述】:

首先这是我的urlObject 的样子:

{
    term_id_1: "2155"
    term_id_2: "2894"
    ticker_1: "SPY"
    ticker_2: "SPY"
}

我最多可以有 3 个术语和代码,例如:

ticker_1ticker_2ticker_3

使用它们的匹配标签:

term_id_1term_id_2term_id_3

这是我当前的函数,它检查代码和标签组合是否存在然后调用另一个函数:

function rebuildContainer(urlObject) {
    console.log('urlObject',urlObject);

    if (urlObject.ticker_1 && urlObject.term_id_1) {
        var tickerObj = {};
            tickerObj.ticker = urlObject.ticker_1;
        var tagObj = {};
            tagObj.term_id = urlObject.term_id_1;
        saveTickerTags(tickerObj, tagObj);
    }

    if (urlObject.ticker_2 && urlObject.term_id_2) {
        var tickerObj = {};
            tickerObj.ticker = urlObject.ticker_2;
        var tagObj = {};
            tagObj.term_id = urlObject.term_id_2;
        saveTickerTags(tickerObj, tagObj);
    }

    if (urlObject.ticker_3 && urlObject.term_id_3) {
        var tickerObj = {};
            tickerObj.ticker = urlObject.ticker_3;
        var tagObj = {};
            tagObj.term_id = urlObject.term_id_3;
        saveTickerTags(tickerObj, tagObj);
    }
}

这个感觉好像很容易简化,你会怎么做?

【问题讨论】:

    标签: javascript performance loops optimization javascript-objects


    【解决方案1】:

    注意,我在此处发布此答案,因为这是我最终采用的解决方案。

    function rebuildContainer(urlObject) {
        var deferred = $q.defer();
        var termIds  = ['term_id_1', 'term_id_2', 'term_id_3'];
    
        var filteredTermIds = _.filter(termIds, function(termId) {
            return urlObject[termId];
        });
    
        _.each(filteredTermIds, function(termId, index) {
            ApiFactory.getTagDataSilm(urlObject[termId]).then(function(res) {
                var tickerObj = {}, tagObj = {}, ticker = 'ticker_'+index;
    
                tagObj            = res.data.ticker_tag;
                tickerObj.ticker  = urlObject[ticker];
                tagObj.term_id    = urlObject[termId];
                tagObj.selected   = true;
                tagObj.its_ticker = { ticker: ticker };
    
                saveTickerTags(tickerObj, tagObj);
            });
        });
    
        deferred.resolve(tickerTagsContainer);
        return deferred.promise;
    }
    

    【讨论】:

      【解决方案2】:

      创建一个接受测试条件的函数并调用它。

      function rebuildContainer(urlObject) {
          console.log('urlObject',urlObject);
          var keyPairs = [['ticker_1', 'term_id_1'], 
                     ['ticker_2', 'term_id_2'], ['ticker_3', 'term_id_3']]
      
          for(var i=0; i<keyPairs.length;i++){
            if(ifExists(keyPairs[i][0], keyPairs[i][1])) {
              var tickerObj = {ticker : urlObject.ticker_1};
              var tagObj = {term_id : urlObject.term_id_1};
              saveTickerTags(tickerObj, tagObj);
            }
          }
      }
      function ifExists(tic,term){
        return (urlObject[tic] && urlObject[term])
      }
      

      或者如果ticker_1term_id_1总是这种形式那么

      function rebuildContainer(urlObject) {
          console.log('urlObject',urlObject);
      
          for(var i=1; i<=(Object.keys(urlObject).length)/2;i++){
            if(urlObject["ticker_"+i] && urlObject["term_id_"+i]) {
              var tickerObj = {ticker : urlObject.ticker_1};
              var tagObj = {term_id : urlObject.term_id_1};
              saveTickerTags(tickerObj, tagObj);
            }
          }
      }
      

      【讨论】:

      • 这里有错误var tagObj = { tagObj.term_id = urlObject.term_id_1 };.
      【解决方案3】:

      这里是已经提到的函数的一个实现:

      function rebuildContainer(urlObj) {
          function checkAndSaveTicker(n) {
              if(urlObj.hasOwnProperty('ticker_'+n) &&   urlObj.hasOwnProperty('term_id_'+n)){
                  saveTickerTags({'ticker' : urlObj['ticker_'+n]},
                                 {'term_id' : urlObj['term_id_' + n]});
              }
          }
          checkAndSaveTicker(1);
          checkAndSaveTicker(2);
          checkAndSaveTicker(3);
      }
      

      【讨论】:

        【解决方案4】:

        还没有真正测试太多,但这应该可以工作,这样您就不必对 id 进行硬编码...

        function rebuildContainer(urlObject) {
            // get the keys that contain the 'ticker' text
            Object.keys(urlObject).filter(function (k) {
                return k.indexOf('ticker') > -1;
            }).forEach(function (k) {
                // get the number at the end and look it up on the urlObject
                var termId = urlObject['term_id_' + k.match(/\d+$/)[0]];
                // if it is defined, save the object
                if(termId !== undefined) {
                    var tickerObj = {};
                    var tagObj = {};
                    tickerObj.ticker = urlObject[k];
                    tagObj.term_id = termId;
                    saveTickerTags(tickerObj, tagObj);
                }
            });
        }
        

        【讨论】:

        • 谢谢!这是我一直在寻找的解决方案,动态调用 forEach 类型循环...稍后会测试它
        • 嗯并没有让它在插入时工作......可能会尝试更多地使用它
        • @LeonGaban 什么不起作用? Here's a running demo.
        • 感谢演示!嗯……感觉这个函数比较难读,但是解决了代码重复/未使用的问题。
        【解决方案5】:

        为其创建一个接受tickerterm_id 的函数并调用它三次。

        如果您喜欢冒险,请编写一个从 1 到 3 的循环 looks up the properties dynamically

        【讨论】:

          猜你喜欢
          • 2019-06-18
          • 1970-01-01
          • 2021-11-18
          • 2023-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多