我调用一个返回标签数组的服务。数组可能是空的,如果是的话,它只保存标记。否则,它将检查标签是否在数组中。如果是这样,则删除标记,否则它将被保存。
这能为效率而优化吗?
function processTag(total, tag, associatedTicker) {
var foundFlag = false;
TagFactory.retrieveTickerTags('onlyTags').then(function(data) {
console.log('onlyTags data',data);
// Is there are selected Tags:
if (data.length > 0) {
// Search for tag in tagFactory
for (var i=0; i<data.length; i++) {
if (data[i].term_id === tag.term_id) {
foundFlag = true;
break;
}
}
// If found, remove tag:
if (foundFlag) {
removeTag(tag, associatedTicker);
}
else {
// Save the tag:
if (total < 3) {
saveTag(tag, associatedTicker);
}
// 3 are already selected, display alert:
else {
displayAlert('failure', 'Only 3 tags can be monitored at a time.');
}
}
}
// Else if there are no selected tags:
else {
saveTag(tag, associatedTicker);
}
});
}发布于 2015-11-10 18:45:25
这里有一个重写,澄清和缩短了代码。它的一些优点是:
data替换为更具描述性的内容。noSavedTags和tagAlreadyExists。saveOrRemoveTag内联。for和map来检查标签是否已经存在,避免冗长、难看的indexOf循环。if... else来表示简单的条件表达式。新的守则:
function processTag(total, tag, associatedTicker) {
TagFactory.retrieveTickerTags('onlyTags').then(saveOrRemoveTag);
function saveOrRemoveTag(savedTags) {
var noSavedTags = savedTags.length == 0;
if (noSavedTags) { checkedSave(); return; }
tagAlreadyExists() ? removeTag(tag, associatedTicker) : checkedSave();
// the 3 lines above are really the entire function
// everything below is just helper functions
function checkedSave() {
total < 3 ? saveTag(tag, associatedTicker)
: displayAlert('failure', 'Only 3 tags can be monitored at a time.');
}
function tagAlreadyExists() {
var existingTermIds = savedTags.map(function(t) { return t.term_id });
return existingTermIds.indexOf(tag.term_id) > -1;
}
}
}发布于 2015-11-10 17:52:10
嗯,我想到了两种优化技术:
if,只需将两个现有的saveTag调用连接在一起。removeTag方法。如下所示:
function processTag(total, tag, associatedTicker) {
var foundFlag = false;
TagFactory.retrieveTickerTags('onlyTags').then(function(data) {
console.log('onlyTags data',data);
// Are there are selected Tags:
// Search for tag in tagFactory
var tagIndex=searchTagInArray(data, tag);
// If found, remove tag:
if (tagIndex>=0) {
removeTag(tag, associatedTicker, tagIndex);
}
else {
// Save the tag if not found or there are not selected tags:
if (data.length==0 || total < 3) {
saveTag(tag, associatedTicker);
}
// 3 are already selected, display alert:
else {
displayAlert('failure', 'Only 3 tags can be monitored at a time.');
}
}
});
}
function searchTagInArray(data, tag){
var foundIndex=-1;
for (var i=0; foundIndex<0 && i<data.length; i++) {
if (data[i].term_id === tag.term_id) {
foundIndex = true;
}
}
return foundIndex;
}如果可以将数组替换为HashMap,则可以保存整个searchTagInArray方法:
(假设retrieveTickerTags返回data作为term_id:data={term0: tag0, term1: tag1, term2: tag2...}索引的标记的HashMap )
function processTag(total, tag, associatedTicker) {
TagFactory.retrieveTickerTags('onlyTags').then(function(data) {
console.log('onlyTags data',data);
// Are there selected Tags:
// Search for tag in tagFactory
var oldTag=data[tag.term_id];
// If found, remove tag:
if (oldTag) {
removeTag(tag, associatedTicker);
}
else {
// Save the tag if not found or there are not selected tags:
if (isEmpty(data) || total < 3) {
saveTag(tag, associatedTicker);
}
// 3 are already selected, display alert:
else {
displayAlert('failure', 'Only 3 tags can be monitored at a time.');
}
}
});
}
function isEmpty(data)
{
for (field in data)
{
return false;
}
return true;
}https://codereview.stackexchange.com/questions/110379
复制相似问题