Javascript 使用模板文本检查两个条件

Javascript 使用模板文本检查两个条件,javascript,template-literals,Javascript,Template Literals,我在一个对象中有以下代码行: return { subtitle: `Published ${date} by ${author}` } 事情是这样的,不一定要设置date或author——这意味着我希望根据是否设置了date、是否设置了author或两者都设置,有条件地呈现subtitle 现在,如果我只需要担心日期,那么我可以做以下检查: return { subtitle: date && `Published ${date}` } 那就行了 同样,对于

我在一个对象中有以下代码行:

return {
    subtitle: `Published ${date} by ${author}`
}
事情是这样的,不一定要设置
date
author
——这意味着我希望根据是否设置了
date
、是否设置了
author
或两者都设置,有条件地呈现
subtitle

现在,如果我只需要担心日期,那么我可以做以下检查:

return {
    subtitle: date && `Published ${date}`
}
那就行了

同样,对于作者:

return {
    subtitle: author && `by ${author}`
}
我搞不懂的是如何同时检查日期和作者


你知道怎么做吗?

我想你的意思是这样做一个条件检查

return date && author ? { subtitle: `Published ${date} by ${author}` }
    : date && !author ? { subtitle: `Published ${date}` }
    : !date && author ? { subtitle: `by ${author}` }

假设
subtitle
可以设置为空字符串,如果
date
author
都是空的,那么我认为可以使用:

一种更高级的模板文本形式是标记模板。标记允许您使用函数解析模板文本。标记函数的第一个参数包含字符串值数组。其余参数与表达式相关。最后,函数可以返回经过处理的字符串[…]

在我看来,这将使两个世界都达到最佳。您保留了${author}发布的${date}的表达性和简单性,同时抽象掉了字符串处理的血淋淋的细节

它看起来是这样的:

subtitle`Published ${date} by ${author}`
//=> 'Published 2019 by John'
//=> or 'Published 2019'
//=> or 'by John'
//=> or ''
注意:为了简单起见,我使用了
flatMap
,但除非您对其进行多边形填充,否则此代码在IE/Edge中无法工作

const subtitle=(字符串、日期、作者)=>
串
.flatMap((str,idx)=>
idx==0&&date?[str,date]:
idx==1&&author?[str,author]:
[])
.加入(“”)
.trim();
让我们约会;
让作者;
日期='2019',作者='John';
log(副标题`Published${date}by${author}`);
日期='2019',作者='';
log(副标题`Published${date}by${author}`);
日期='',作者='约翰';
log(副标题`Published${date}by${author}`);
日期=“”,作者=“”;

log(副标题`Published${date}by${author}`)
subtitle:[date&&`published${date}',author&&`by${author}`].filter(a=>a).join(“”)
@ChrisG智能解决方案确实有效--但我想知道是否有一种更简单的方法可以做到这一点manner@ChrisG有一个伟大的它看起来像!最后一个三元表达式,即
!日期和作者
缺少第三个操作数。