V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xjdata
V2EX  ›  问与答

关于"表驱动法"的疑问.谢谢大家.

  •  
  •   xjdata · 2016-02-11 10:10:29 +08:00 · 1984 次点击
    这是一个创建于 3200 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家猴年好, 最近看到 表驱动法,刚好碰到类似的情况,于是尝试实现.但是觉得根本没有实现. 请看代码. 一共有三个问题

    1. 上方的表定义 有什么比较好的办法吗?虽然人工的列出了所有的可能性,但是感觉很傻... 如果在多一个条件,或 N 个条件,那彻底没办法人工枚举了...
    2. if 是否有优雅一点的写法呢
    3. 为什么我这里 return e[3]; 不会中断 forEach 呢

    感谢你的回复.

    function getParentId(level, focusType, addType, select_id, parent_id) {
                // focusType 0 = 节点  1 = 事项
                // addType 0 = 节点  1 = 事项
                var default_id = 1;
                var array = [
                    //[level,focusType,addType,returnKey]
                    [1, 0, 0, select_id],//选第一层节点,选节点,加节点 --> 返回 当前节点的 key
                    [1, 1, 0, default_id],//选第一层节点,选事项,加节点 --> 返回 1
                    [1, 0, 1, select_id],//选第一层节点,选节点,加事项 --> 返回 当前节点的 key
                    [1, 1, 1, parent_id],//选第一层节点,选事项,加事项 --> 返回 父节点 key
    
                    [0, 1, 0, parent_id],//非第一层节点,选事项,加节点 --> 返回 父节点 key
                    [0, 0, 0, select_id],//非第一层节点,选节点,加节点 --> 返回 当前节点的 key
                    [0, 0, 1, select_id],//非第一层节点,选节点,加事项 --> 返回 当前节点的 key
                    [0, 1, 1, parent_id]//非第一层节点,选事项,加事项--> 返回 父节点 key
                ];
    
                /*
                * 问题 1 上方的表定义 有什么比较好的办法吗?
                * 虽然这里人为的列出了所有的可能性,但是感觉很傻... 如果在多一个条件,或 N 个条件,那彻底没办法人工枚举了...
                * */
    
                var id = default_id;
                array.forEach(function (e) {
                    if (
                        e[0] == level
                        && e[1] == focusType
                        && e[2] == addType
                        /* 问题 2  这里的 if 是否有优雅一点的写法呢? */
                    ) {
                        id = e[3];
                        /* 问题 3  为什么我这里 return e[3]; 不会中断 forEach 呢? */
                    }
                });
                return id;
            }
    
    1 条回复    2016-02-11 11:30:24 +08:00
    guoguoer
        1
    guoguoer  
       2016-02-11 11:30:24 +08:00 via Android
    可能的几点想法:
    1. 如果写表比写逻辑复杂,表可以用代码生成
    2. 查找遍厉太麻烦,可以直接生成最终表,比如用一个多维数组,代码直接返回值
    3. foreach 跟 for 不同,没有 break
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2536 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 01:30 · PVG 09:30 · LAX 17:30 · JFK 20:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.