javascript - 关于"表驱动法"的疑问.谢谢大家.
程序员文章站
2022-04-13 18:22:07
...
大家猴年好, 最近看到 表驱动法,刚好碰到类似的情况,于是尝试实现.但是觉得根本没有实现. 请看代码. 一共有三个问题
上方的表定义 有什么比较好的办法吗?虽然人工的列出了所有的可能性,但是感觉很傻... 如果在多一个条件,或N个条件,那彻底没办法人工枚举了...
if 是否有优雅一点的写法呢
为什么我这里 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;
}
回复内容:
大家猴年好, 最近看到 表驱动法,刚好碰到类似的情况,于是尝试实现.但是觉得根本没有实现. 请看代码. 一共有三个问题
上方的表定义 有什么比较好的办法吗?虽然人工的列出了所有的可能性,但是感觉很傻... 如果在多一个条件,或N个条件,那彻底没办法人工枚举了...
if 是否有优雅一点的写法呢
为什么我这里 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,2:
表中的一个项目是用于匹配模式的信息. 这些信息简单时可以用[1, 0, 0]
这样的纯数据来表示 (下面那个if的实质是个把数据转化为行为的interpreter), 复杂起来就不如用匿名函数了
问题3. 你返回什么都不会让forEach中断