Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何读取/理解json对象中嵌套的三元值_Javascript_Reactjs - Fatal编程技术网

Javascript 如何读取/理解json对象中嵌套的三元值

Javascript 如何读取/理解json对象中嵌套的三元值,javascript,reactjs,Javascript,Reactjs,我试图破译其他人的代码,但很难理解每个键都有嵌套三元值的json对象。请帮助我理解/阅读此代码: 问题:您如何阅读此内容(if/else的哪一部分在何时以及如何分配?) 下面是如何定义currentRole的 const UserContext = createContext({ authenticated: false, profile: null }); const [userState, setUserState] = useContext(UserContext); const cu

我试图破译其他人的代码,但很难理解每个键都有嵌套三元值的json对象。请帮助我理解/阅读此代码:

问题:您如何阅读此内容(if/else的哪一部分在何时以及如何分配?)

下面是如何定义currentRole的

const UserContext = createContext({
  authenticated: false, profile: null
});
const [userState, setUserState] = useContext(UserContext);
const currentRole = userState.currentRole;

请帮助我理解如何读取json key:value对的if/else部分


谢谢

我想你知道什么是三元运算符了。如果没有,请看一看

让我们分解权限部分

let权限={
视图:currentRole?数组.isArray(currentRole.view)?
currentRole.view.includes(标题):false:false,
创建:currentRole?数组.isArray(currentRole.create)?
currentRole.create.includes(标题):false:false,
编辑:currentRole?数组.isArray(currentRole.edit)?
currentRole.edit.includes(标题):false:false,
全部:currentRole?数组.isArray(currentRole.all)?
currentRole.all.includes(标题):false:false,
}
专注于

const view=currentRole?数组.isArray(currentRole.view)?
currentRole.view.includes(标题):false:false;
我们可以把它看作是

const view=currentRole?数组.isArray(currentRole.view)?
(currentRole.view.includes(标题):false:false);
i、 e.如果
currentRole
的计算结果为true,则

const view=Array.isArray(currentRole.view);
否则,

const view=currentRole.view.includes(标题):false:false;

我不确定这是否澄清了你的问题。希望有帮助。

给出了一个嵌套的三元表达式

currentRole ? Array.isArray(currentRole.view) ? 
  currentRole.view.includes(title) : false : false
优先级顺序为从左到右,或在格式正确时

currentRole
  ? Array.isArray(currentRole.view)
    ? currentRole.view.includes(title)
    : false
  : false;
现在,通过索引深度更容易看到哪些值与哪些三元运算符匹配

使用if-else块的等效代码段

if (currentRole) {
  if (Array.isArray(currentRole.view)) {
    return currentRole.view.includes(title);
  } else {
    return false;
  }
} else {
  return false
}
这是冗余的,尽管两个逻辑分支返回相同的值,但可以简化为

if (currentRole && Array.isArray(currentRole.view)) {
  return currentRole.view.includes(title);
} else {
  return false
}

或者更简单地说(归功于@cars10m!),它完全删除了三元运算符

currentRole &&
  Array.isArray(currentRole.view) &&
  currentRole.view.includes(title);

每个条件测试都需要解析truthy以继续处理表达式,最终测试的结果就是返回的值。

这不是进一步的解释-@Drew Reese已经在这方面做了大量工作-但是创建JSON的另一个简单方法是:

let currentRole={edit:['game'],all:['comments']},
标题为“游戏”;
let res=“查看、创建、编辑、全部”。拆分(',).reduce((a、c)=>
(a[c]=当前角色
&&Array.isArray(currentRole[c])
&&当前角色[c]。包括(标题),a),{});
控制台日志(res)三元操作:

让我们举一个例子:

condition ? trueResult : falseResult
相当于:

if(condition)
{
return trueResult
}
else{
return falseResult
}
另一个

condition1? return1
:conditions? return2
:conditions?return3 
condition1 ? condition2 ? return1:return2:return3
类似于

if(condition1){

return return1

}elseif(condition2){

return return2

}elseif(condition3){

return return3

}
另一个

condition1? return1
:conditions? return2
:conditions?return3 
condition1 ? condition2 ? return1:return2:return3
相当于:

if(condition1){

if(condition2){

return return1

}else{

return return2

}

}else{

return return3

}
你的情况也一样

 view: currentRole ? Array.isArray(currentRole.view) ? 
      currentRole.view.includes(title) : false : false,
相当于

if(currentRole){

if(Array.isArray(currentRole.view){

return currentRole.view.includes(title)

}else{

return false

}}else{

return false

}

让我们从一个简单的三元运算符开始 比如说,

a == b ? console.log(a) : console.log(b);
这里,如果a==b条件为true,那么它将执行第一个语句console.log(a) 否则,第二条语句执行console.log(b)

拇指规则:始终开始从LHS到RHS读取三元运算符。

让我们从代码开始

let permissions = {
    view: currentRole ? Array.isArray(currentRole.view) ? 
      currentRole.view.includes(title) : false : false,
    create: currentRole ? Array.isArray(currentRole.create) ? 
      currentRole.create.includes(title) : false : false,
    edit: currentRole ? Array.isArray(currentRole.edit) ? 
      currentRole.edit.includes(title) : false : false,
    all: currentRole ? Array.isArray(currentRole.all) ? 
      currentRole.all.includes(title) : false : false,
  }
让我们从permissions对象读取视图键

view: currentRole ? Array.isArray(currentRole.view) ? 
      currentRole.view.includes(title) : false : false
让我们导出这个三元运算符:

  • 条件:在问号(?)之前<代码>当前角色
  • 是您的情况

  • 第一个语句:在第一个问号(?)之后和最后一个冒号(:)之前

    Array.isArray(currentRole.view)?currentRole.view.includes(标题):false

    这是你的第一个陈述

  • 第二个语句:在最后一个冒号(:)
    false
    之后是您案例中的第二个语句

  • 现在让我们考虑一个简单的三元运算符

    如果条件为true,则将执行第一条语句,否则将执行第二条语句。 就你而言

  • 让我们假设
    currentRole
    是真的

    第一条语句
    Array.isArray(currentRole.view)?currentRole.view.includes(title):将执行false
    。 现在再次将第一个语句视为三元运算符! 此turnary运算符返回的任何值都将是查看键的值

  • 假设
    currentRole
    为false,则将执行第二条语句
    false
    。因此
    查看键
    值将为


  • 除非数据库中的
    currentRole.view
    create
    edit
    all
    定义为true,否则用于
    view
    currentRole.create
    的代码的作者似乎总是false。但有时他们需要对某些
    标题的测试破例。当他们需要测试
    标题时,他们会将其添加到数组中,并将冒号前的第一个运算符更改为true。这将让他们测试某个特定的标题,当它是可编辑的时候它会是什么样子。。。可能没有登录到系统。他们所有这些都是假的,所以除了测试单个标题而不使整个系统陷入编辑状态之外,没有理由使用这种逻辑


    这看起来像是正在测试的生产代码。将所有三元值保持为false是一种安全机制,以防万一。TL;博士除了测试一个特定的
    标题

    之外,没有任何理由需要额外的逻辑。哦,心理体操稍微多一些,但我确实喜欢完全去掉三分之一。是的,我知道,可能有点“过头”,但这是心理体操的一个练习D