如何使用三元运算符执行此IF?
if (img != null) {
return img;
} else if (!user) {
return 'img.svg';
} else if (user) {
if (user.img && !camera) {
return `imgServer`;
} else if (!user.img && !camera) {
return 'img.svg';
} else if (user.img && camera) {
return camera;
} else if (!user.img && camera) {
return camera;
}
}
我已经尝试了几种方法,但都不适合我
您可以将语句压缩成这样,而无需使用不可读和可理解的三进制。
if (img != null) return img; // maybe this would work, too if (img) return img;
if (!user || !user.img) return 'img.svg';
if (camera) return camera;
return `imgServer`;
更短的方法:
return image
|| (!user || !user.img) && 'img.svg'
|| camera
|| `imgServer`;
您确定这里需要一个三进制吗?就我个人而言,我总是发现在最好的时候,燕窝很难进行开发和调试。
我将从简化if语句树开始。正如其他人所说,您可以将else if (user)
简化为"else"。给你:
if (img != null) {
return img;
} else if (!user) {
return 'img.svg';
} else {
// simplified because of the previous if statement
if (user.img && !camera) {
return `imgServer`;
} else if (!user.img && !camera) {
return 'img.svg';
} else if (user.img && camera) {
return camera;
} else if (!user.img && camera) {
return camera;
}
}
然后,我将通过重新排序来简化嵌套if语句:
if (img != null) {
return img;
} else if (!user) {
return 'img.svg';
} else {
// simplified because of the previous if statement
if (user.img && !camera) {
return `imgServer`;
} else if (!user.img && camera) {
return camera;
} else if (user.img && camera) {
return camera;
}
// Since there are four possible states allowed
// (write out a truth table for proof), we can
// simplify this nested if statement
return 'img.svg';
}
现在一切都简化了,您可以处理创建一个三进制。首先,嵌套if:
if (img != null) {
return img;
} else if (!user) {
return 'img.svg';
} else {
// simplified because of the previous if statement
return (user.img && !camera) ? `imgServer` :
(!user.img && camera) ? camera :
(user.img && camera) ? camera :
'img.svg';
}
最后是外部if语句:
return (img != null) ? img :
(!user) ? 'img.svg' :
(user.img && !camera) ? `imgServer` :
(!user.img && camera) ? camera :
(user.img && camera) ? camera :
'img.svg';
}
由于您的if
中有return
语句,因此您的代码可能需要进行一些重构。。。这是您上面所写内容的直接等价。
let returnValue = img != null ? img : !user ? 'img.svg' : user.img && !camera ? `imgServer` : !user.img && !camera ? 'img.svg' : user.img && camera ? camera : !user.img && camera : camera;
return returnValue;
但老实说,我觉得这个具体的例子可以简化一点。。。
正如评论中所指出的,由于您有
return
语句,您不需要所有这些else if
,并且您可以将逻辑压缩一点
以下内容相当于您的问题中的代码
if (img != null) return img;
if (!user) return 'img.svg';
if (!camera) {
if (user.img) return `imgServer`;
return 'img.svg';
}
return camera;
如果你绝对希望它是三元的,那就是:
let returnValue = img != null ? img : !user ? 'img.svg' : !camera ? user.img ? `imgServer` : 'img.svg' : camera;
return returnValue;
这将是一个不那么紧凑的答案,可能也不像Nina Scholz的答案那样优雅,但如果if
s的序列和布尔求值对你很重要,它可能会起到的作用
如果您不介意使用几个If语句。。
const imgSvg = 'img.svg' // Maybe use a variable for 'img.svg'?
if (img) return img
if (!user) return imgSvg
return camera || (user.img ? 'imgServer' : imgSvg)
所以。。
如果你有img
,就把它退回。
如果你没有img
。。如果不存在user
,那么接下来要做的就是返回"img.svg"。。
即。。if (!user) return imgSvg
从那里它取决于camera
和user.img
。。
即。。return camera || user.img ? 'imgServer' : imgSvg
注意:这与@Nina Scholz的回答非常相似。。但你有一个案例:
如果存在!user.img
和camera
,则返回camera
@妮娜·朔尔茨的回答不允许这样。如果我错了,请纠正我。