如何简化/精简这段代码? (对象签入函数调用)
How to simplify / streamline this code? (Object check into function call)
首先这是我的 urlObject
的样子:
{
term_id_1: "2155"
term_id_2: "2894"
ticker_1: "SPY"
ticker_2: "SPY"
}
我最多可以有 3 个术语和代码,例如:
ticker_1
、ticker_2
、ticker_3
与其匹配的标签:
term_id_1
、term_id_2
、term_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);
}
}
感觉可以很简单的简化一下,你会怎么做?
为它创建一个函数,接受一个 ticker
和一个 term_id
并调用它三次。
如果你喜欢冒险,写一个从 1 到 3 的循环 looks up the properties dynamically。
创建一个接受测试条件的函数并调用它。
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_1
、term_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);
}
}
}
下面是已经提到的函数的实现方式:
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);
}
还没有真正测试太多,但这应该有效,这样您就不必对 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);
}
});
}
注意,我在这里发布这个答案,因为这是我最终采用的解决方案。
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;
}
首先这是我的 urlObject
的样子:
{
term_id_1: "2155"
term_id_2: "2894"
ticker_1: "SPY"
ticker_2: "SPY"
}
我最多可以有 3 个术语和代码,例如:
ticker_1
、ticker_2
、ticker_3
与其匹配的标签:
term_id_1
、term_id_2
、term_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);
}
}
感觉可以很简单的简化一下,你会怎么做?
为它创建一个函数,接受一个 ticker
和一个 term_id
并调用它三次。
如果你喜欢冒险,写一个从 1 到 3 的循环 looks up the properties dynamically。
创建一个接受测试条件的函数并调用它。
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_1
、term_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);
}
}
}
下面是已经提到的函数的实现方式:
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);
}
还没有真正测试太多,但这应该有效,这样您就不必对 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);
}
});
}
注意,我在这里发布这个答案,因为这是我最终采用的解决方案。
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;
}