首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查数组中的标签

问检查数组中的标签
EN

Code Review用户
提问于 2015-11-10 17:33:12
回答 2查看 74关注 0票数 2

我调用一个返回标签数组的服务。数组可能是空的,如果是的话,它只保存标记。否则,它将检查标签是否在数组中。如果是这样,则删除标记,否则它将被保存。

这能为效率而优化吗?

代码语言:javascript
复制
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);
        }
    });
}
EN

回答 2

Code Review用户

回答已采纳

发布于 2015-11-10 18:45:25

这里有一个重写,澄清和缩短了代码。它的一些优点是:

  • 删除嵌套的如果..。其他语句
  • 将vague变量名data替换为更具描述性的内容。
  • 将您在代码中隐式使用的概念命名(例如,"checkedSave“的意思是”检查它是否有效保存标记,然后保存它“)。我们还命名了我们感兴趣的各种条件:noSavedTags和tagAlreadyExists。
  • 避免不必要的缩进,方法是不定义回调saveOrRemoveTag内联。
  • 通过使用for和map来检查标签是否已经存在,避免冗长、难看的indexOf循环。
  • 用户三元操作符代替if... else来表示简单的条件表达式。

新的守则:

代码语言:javascript
复制
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;
        }
    }
}
票数 2
EN

Code Review用户

发布于 2015-11-10 17:52:10

嗯,我想到了两种优化技术:

  1. 您可以保存一个if,只需将两个现有的saveTag调用连接在一起。
  2. 您可以避免迭代数组两次,只需存储已找到的索引并将其作为参数传递给removeTag方法。

如下所示:

代码语言:javascript
复制
    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 )

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/110379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档