如何使用三元运算符执行此IF



如何使用三元运算符执行此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的答案那样优雅,但如果ifs的序列和布尔求值对你很重要,它可能会起到的作用

如果您不介意使用几个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

从那里它取决于camerauser.img。。

即。。return camera || user.img ? 'imgServer' : imgSvg

注意:这与@Nina Scholz的回答非常相似。。但你有一个案例:

如果存在!user.imgcamera,则返回camera

@妮娜·朔尔茨的回答不允许这样。如果我错了,请纠正我。

最新更新