【问题标题】:Refactor javascript function重构javascript函数
【发布时间】:2011-12-14 15:47:02
【问题描述】:

:) 我创建了一些 javascript,它运行良好,我的 javascript 知识限制我创建一些紧凑和轻便的脚本。 这是一些 aspx 框架的子菜单 javascript,这里是脚本:

if (name === 'diensten/consultancy')
            {
                activeOne();
            }
    else if (name === 'diensten/maatwerk')
            {
                activeTwo();
                diesntenActive();
            }
    else if (name === 'diensten/outsourcing')
            {
                activeThree();
                diesntenActive();
            }
    else if (name === 'diensten/opleidingen')
            {
                activeFour();   
                diesntenActive();
            }
    else if (name === 'diensten/implementaties')
            {
                activeFive();
                diesntenActive();
            }
    else if (name === 'support')
            {
                activeOne();
                supportActive();
            }
    else if (name === 'support/contact')
            {
                activeTwo();
                supportActive();
            }
    else if (name === 'support/download')
            {
                activeThree();
                supportActive();
            }
    else if (name === 'overOns')
            {
                activeOne();
                overOnsActive()
            }
    else if (name === 'overOns/cebes')
            {
                activeTwo();
                overOnsActive()
            }
    else if (name === 'overOns/partner')
            {
                activeThree();
                overOnsActive();
            }
    else if (name === 'overOns/vacatures')
            {
                activeFour();
                overOnsActive();
            }
    else if (name === 'fireman')
            {
                productenActive();
            }
    else if (name === 'prio')
            {
                productenActive();
            }
    else if (name === 'firstwatch')
            {
                productenActive();
            }
    else if (name === 'firstwatchOnline')
            {
                productenActive();
            }
    else if (name === 'cebesFrame')
            {
                productenActive();
            }
    else if (name === 'cms')
            {
                productenActive();
            }   
    return false

我相信有一种方法可以缩短这个javascript,不是太急,只是为了让我更多地了解javascript。欢迎任何建议。谢谢。

【问题讨论】:

  • 也许澄清不是来自这个脚本本身,而是来自更大的范围。该方法的目的是什么?什么是“activeX()”方法?等等。一种改变可能不是只有一种方法来设置 UI,而是所有部分都可以订阅一个事件并决定自己做什么。请描述你在做什么
  • 问题与/asp.net 或 aspx 无关,我会看看您是否可以将名称传递给各种 Active 函数

标签: javascript submenu


【解决方案1】:

首先是使用switch 语句而不是长的if/else 树。

switch (name) {
  case 'diensten/consultancy': 
    activeOne (); 
    break;

  case 'diensten/maatwerk':
    activeTwo (); 
    diesntenActive (); 
    break;

  ...

  case 'cms':
    productActive (); 
    break;

  default:
    console.log ("No handler found for '" + name + "'!");
}

另一种方法是使用object,您可以在其中定义函数并将它们与相关键相关联。

var func_map = {
  'diensten/consultancy': function () {
    activeOne ();
  },

  'diensten/maatwerk': function () {
    activeTwo ();
    diesntenActive ();
  },

  'diensten/outsourcing': function () {
    activeThree();
    diesntenActive();
  },

  ...

  'cms': function () {
    productenActive();
  }
};

if (name in func_map) func_map[name] ();
else console.log ("No handler found for name = '" + name + "'!");

【讨论】:

    【解决方案2】:

    你有一个查找表的完美情况。您对名称有很多可能性,并且您对每个名称的操作只是一个或多个简单的函数调用。

    这意味着您可以使用查找表。您将 name 的值作为键,并使用一组函数名称来调用该名称。表中的一次查找会为您提供一组要调用的函数,然后您循环遍历该数组以调用每个函数。这样做的好处是要添加更多项目,您只需在表格中添加一个新行,而无需编写任何额外的代码行:

    var lookup = {
        "cms": [productenActive],
        "cebesFrame": [productenActive],
        "firstWatchOnline": [productenActive],
        "fireman": [productenActive],
        "firstwatch": [productenActive],
        "prio": [productenActive],
        "overOns/vacatures": [activeFour, overOnsActive],
        "overOns/partner":  [activeThree, overOnsActive],
        "overOns/cebes": [activeTwo, overOnsActive],
        "overOns": [activeOne, overOnsActive],
        "support/download": [activeThree, supportActive],
        "support/contact": [activeTwo, supportActive],
        "support": [activeOne, supportActive],
        "diensten/implementaties": [activeFive, diesntenActive],
        "diensten/opleidingen": [activeFour, dienstenActive],
        "dienstenout/outsourcing": [activeThree, dienstenActive],
        "diensten/maatwerk": [activeTwo, dienstenActive],
        "diensten/consultancy": [activeOne]
    };
    
    var fns = lookup[name];
    if (fns) {
        for (var i = 0; i < fns.length; i++) {
            fns[i]();
        }
    }
    

    【讨论】:

    • 也许这是个愚蠢的问题,productenActive,activeOne 是函数,你上面解释的技术是否支持这种情况?无论如何,谢谢,
    • @user1097182 - 是的,该表包含 for 循环执行的函数引用。
    【解决方案3】:

    这是我的尝试。它不是最好的,因为它非常适合您的情况。但是,它确实提供了很多动态调用和代码重用。

    var subPage = {
        'diensten' : ['consultancy', 'maatwerk', 'outsourcing', 'opleidingen', 'implementaties'],
        'support'  : [undefined, 'contact', 'download'],
        'overOns'  : [undefined, 'cebes', 'partner', 'vacatures'],
    }
    var others = ['fireman', 'prio', 'firstwatch', 'firstwatchOnline', 'cebesFrame', 'cms'];
    var active = [activeOne, activeTwo, activeThree, activeFour, activeFive];
    
    var addr = name.split('/');
    if (subPage[addr[0]]){
        var index = subPage[addr[0]].indexOf(addr[1]);
        if (index != -1){
            active[index]();
            if (addr[1] !== 'consultancy') // Special case
                this[adder[0]+'Active'](); // Assuming this refers to the scope where diesntenActive() lives
        }
    } else if (others.indexOf(addr[0]) != -1){
        productenActive();
    }
    return false;
    

    无论如何,这可能会使事情过于复杂。我仍然建议您使用 switch 语句或查找表,除非您真的很关心减小脚本大小。只有在这种情况下,您才能考虑我非常专业的方法。

    【讨论】:

    • 哇,看起来很复杂,不过谢谢你的回答,我会考虑的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多