javascript - javascript - 简化:如果 Var 为空,则为“”,否则将 Var 用文本括起来
问题描述
我正在写es模板。我想让代码尽可能简单,最好避免使用 (function(){return XXX})()
上下文:当列表没有任何内容时,不打印任何内容,否则打印带有 ul 标签的列表。
${
// same filter 2 times
arr.filter( d=>d.prop1=="a" ).length==0
? ""
: `<ul> ${ arr.filter( d=>d.prop1=="a" ).map(d=>`<li>${d.text}</li>`) } </ul>`
}
或者
${
// function makes it bulky
(function(){
let arr2 = arr.filter( d=>d.prop1=="a" );
if( arr2.length == 0 ){
return ""
}else{
return `<ul> ${ arr2.map(d=>`<li>${d.text}</li>`) } </ul>`
}
})()
}
还有一个上下文,有时问题是这样的:
const NAMES = [
{ name:"John" },
{ name:"Michael", nickname:"Mike" },
];
NAMES.map( n=>`name: ${n.name} ${ n.nickname? "("+n.nickname+")":"" }` ).join("\n")
// can simplify n.nickname? "("+n.nickname+")":"" ?
有人想出一种方法来简化这些吗?谢谢。
解决方案
使用array.some
比检查过滤数组的长度要快一点。
${
ARR.some(o => !!o.attr)
? `<ul>${ARR.filter(o => !!o.attr).map(o => (`<li>${o.attr}</li>`))}</ul>`
: ""
}
此外,由于大多数模板不打印false
值,您可以使用&&
.
${ ARR.some(o => !!o.attr) && `<ul>${ARR.filter(o => !!o.attr).map(o => (`<li>${o.attr}</li>`))}</ul>` }
如果您不想保持重复的条件,则必须使用变量,所以除了使用函数之外,我不知道有什么其他方法。使用上面的技巧,您可以稍微减小函数大小。
${
((arr) => {
arr = arr.filter(o => !!o.attr);
return !!arr.length && `<ul>${arr.map(o => (`<li>${o.attr}</li>`))}</ul>`;
})(ARR)
}
对于NAMES
,您可以只使用背杆。
NAMES.map(o => (`Name: ${o.name}${o.nickname ? ` (${o.nickname})` : ""}`))
推荐阅读
- javascript - Konva.js 2D 画布 - 动态加载元素上的鼠标向下功能仅适用于最后加载的元素
- javascript - 如何在 OpenLayers 中加入具有 Vectortile 源功能的外部 json 文件?
- html - 粘性位置引导程序 4
- python - 如何将₹22000字符串转换为python中的浮点数
- python-3.x - pandas df.to_sql() 是否回滚?
- pandas - Python 中的 for 循环会导致不希望的结果
- android - Kotlin 数据绑定 - 执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生故障
- javascript - 如何在 UI reactjs 中打印对象响应
- python - 输入 "with" 语句时 return 和 yield 的不同行为
- python - usr/local/lib/libbz2.a:无法读取符号:错误值