javascript 基于返回不同输出的数组元素

dw1jzc5e  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(132)

我有一个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';
  }
};
s5a0g9ez

s5a0g9ez1#

您可以从删除重复的inputArray.indexOf()调用开始--这会使所有内容更难阅读。只检查一次会更简单:

const hasCreate = inputArray.indexOf(CREATE) > -1;
const hasUpdate = inputArray.indexOf(UPDATE) > -1;
const hasRead = inputArray.indexOf(READ) > -1;

第二,您设置的规则显示您有三个访问属性-readupdatecreate,每个属性都可能“隐含”另一个属性。查看这些属性,可以清楚地看到您具有以下关系:

read => read
update => update, read
create => create, read

因此,updatecreate实际上是复合的,这意味着可以修改初始检查以考虑这些:

const hasCreate = inputArray.indexOf(CREATE) > -1;
const hasUpdate = inputArray.indexOf(UPDATE) > -1;
const hasRead = hasCreate || hasUpdate || inputArray.indexOf(READ) > -1;

这避免了检查某人是否有readupdate
需要注意的是,您可以只使用Array#includes而不检查索引。
话虽如此,读取权限几乎是无关紧要的。如果它是“唯一”可用的,它就很重要,在所有其他情况下,它几乎被忽略或假设存在。尽管如此,对隐含规则进行建模是有用的--也许这在未来会改变。
最后,这个逻辑太复杂了。只有四种可能的最终状态,而且正如上面提到的,read甚至没有被用于其中的大多数。下面是更新后的代码,它完成了所有的检查。我添加了另一个名为“None”的状态,用于根本没有权限的情况。即使这种情况不可能发生,我发现拥有它并不使用它比省略它更容易:

const caluclateAcess = (inputArray) => {
  const hasCreate = inputArray.includes('create');
  const hasUpdate = inputArray.includes('update');
  const hasRead = hasCreate || hasUpdate || inputArray.includes('read');
  
  if (hasCreate === true && hasUpdate === true) return "ALL";
  if (hasCreate) return "CreateAndRead";
  if (hasUpdate) return "UpdateAndRead";
  if (hasRead) return "Read";
  
  return "None";
};

console.log("create =>",               caluclateAcess(["create"])                  );
console.log("read =>",                 caluclateAcess(["read"])                    );
console.log("update =>",               caluclateAcess(["update"])                  );
console.log("create, read =>",         caluclateAcess(["create", "read"])          );
console.log("update, read=>",          caluclateAcess(["update", "read"])          );
console.log("create, update =>",       caluclateAcess(["create", "update"])        );
console.log("create, read, update =>", caluclateAcess(["create", "read", "update"]));
console.log("<nothing> =>",            caluclateAcess([])                          );

READCREATEUPDATE变量不是 * 必需的 *,因为它们只使用一次,所以我内联了它们以进一步缩短代码。
然而,如果真的不可能有空的access属性数组,那么这就意味着read访问是完全无关紧要的。不可能没有它。因此,可以完全跳过对它的检查,并且函数的默认返回值可以从"None"更改为"Read"。然而,我个人倾向于保持检查--它不会损害任何功能,并且实现不会产生与规范的偏差。如果规范在未来发生变化,或者存在某种bug,最好不要自动授予读访问权限。

相关问题