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

WBOY
發布: 2016-06-06 20:18:36
原創
1497 人瀏覽過

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

  1. 上方的表定义 有什么比较好的办法吗?虽然人工的列出了所有的可能性,但是感觉很傻... 如果在多一个条件,或N个条件,那彻底没办法人工枚举了...

  2. if 是否有优雅一点的写法呢

  3. 为什么我这里 return e[3]; 不会中断 forEach呢

感谢你的回复.

<code class="js">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;
        }</code>
登入後複製
登入後複製

回复内容:

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

  1. 上方的表定义 有什么比较好的办法吗?虽然人工的列出了所有的可能性,但是感觉很傻... 如果在多一个条件,或N个条件,那彻底没办法人工枚举了...

  2. if 是否有优雅一点的写法呢

  3. 为什么我这里 return e[3]; 不会中断 forEach呢

感谢你的回复.

<code class="js">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;
        }</code>
登入後複製
登入後複製

问题1,2:

表中的一个项目是用于匹配模式的信息. 这些信息简单时可以用[1, 0, 0]这样的纯数据来表示 (下面那个if的实质是个把数据转化为行为的interpreter), 复杂起来就不如用匿名函数了

问题3. 你返回什么都不会让forEach中断

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!