我有一个caluclateAcess
函数,它把一个数组作为输入,这个数组最大值是3个元素,最小值是1个元素,所以可能的元素是create,read和update,所以它基本上是2^3,这意味着有8种可能性,所以我列出了所有的可能性,然后返回一个值。
我会列出可能的输入,以及我应该返回什么样的输出,空的数组不会出现,这意味着假,假,假。
create => 'CreateAndRead'
read => 'Read'
update => 'UpdateAndRead'
create,read => 'CreateAndRead'
update, read => 'UpdateAndRead'
create, update => 'ALL'
create,read, update => 'ALL'
所以我写了下面的函数;有没有更好的方法来达到这个目标?
let READ = 'read';
let CREATE = 'create';
let UPDATE = 'update';
const caluclateAcess = (inputArray) => {
if (
(inputArray.indexOf(READ) > -1
&& inputArray.indexOf(UPDATE) > -1
&& inputArray.indexOf(CREATE) > -1)
||
(
inputArray.indexOf(UPDATE) > -1
&& inputArray.indexOf(CREATE) > -1
)
) {
return 'ALL';
}
if (
(inputArray.indexOf(CREATE) > -1
&& inputArray.indexOf(READ) > -1)
|| (inputArray.indexOf(CREATE) > -1
&& (inputArray.indexOf(READ) === -1 && inputArray.indexOf(UPDATE) === -1))
) {
return 'CreateAndRead';
}
if (
(inputArray.indexOf(UPDATE) > -1
&& inputArray.indexOf(READ) > -1)
|| (inputArray.indexOf(UPDATE) > -1
&& (inputArray.indexOf(READ) === -1 && inputArray.indexOf(CREATE) === -1))
) {
return 'UpdateAndRead';
}
if (inputArray.indexOf(READ) > -1) {
return 'Read';
}
};
1条答案
按热度按时间s5a0g9ez1#
您可以从删除重复的
inputArray.indexOf()
调用开始--这会使所有内容更难阅读。只检查一次会更简单:第二,您设置的规则显示您有三个访问属性-
read
、update
和create
,每个属性都可能“隐含”另一个属性。查看这些属性,可以清楚地看到您具有以下关系:因此,
update
和create
实际上是复合的,这意味着可以修改初始检查以考虑这些:这避免了检查某人是否有
read
或update
。需要注意的是,您可以只使用
Array#includes
而不检查索引。话虽如此,读取权限几乎是无关紧要的。如果它是“唯一”可用的,它就很重要,在所有其他情况下,它几乎被忽略或假设存在。尽管如此,对隐含规则进行建模是有用的--也许这在未来会改变。
最后,这个逻辑太复杂了。只有四种可能的最终状态,而且正如上面提到的,
read
甚至没有被用于其中的大多数。下面是更新后的代码,它完成了所有的检查。我添加了另一个名为“None”的状态,用于根本没有权限的情况。即使这种情况不可能发生,我发现拥有它并不使用它比省略它更容易:READ
、CREATE
和UPDATE
变量不是 * 必需的 *,因为它们只使用一次,所以我内联了它们以进一步缩短代码。然而,如果真的不可能有空的access属性数组,那么这就意味着
read
访问是完全无关紧要的。不可能没有它。因此,可以完全跳过对它的检查,并且函数的默认返回值可以从"None"
更改为"Read"
。然而,我个人倾向于保持检查--它不会损害任何功能,并且实现不会产生与规范的偏差。如果规范在未来发生变化,或者存在某种bug,最好不要自动授予读访问权限。