15

有没有办法在模板字符串中进行条件处理?

例如:

let x, y;

x = ...
y = ...

let templateString = `${x} ${y}`;

如果 y 未定义,我不希望在 x 之后输出模板字符串中的空格。我将如何使用模板字符串实现这一点?

这是唯一的方法吗?

 let templateString = `${x}${y ? ' ' + y : ''}`;
4

7 回答 7

14

关于什么

let x,y;

const templateString = [x,y].filter(a => a).join(' ');

它首先将您的属性放入数组 [] 中。

然后它过滤未定义的项目。

最后,它通过使用join空格来创建数组的字符串。

这种方式或者x或者y可以是未定义的。

于 2018-11-16T17:54:02.557 回答
10

如果您不在模板中添加逻辑,它看起来会更容易阅读:

let templateString = y ? `${x} ${y}` : `${x}`;
于 2018-11-16T17:54:19.997 回答
7

使用嵌套模板文字的另一种稍微简洁的方法。

`${x}${y ? ` ${y}` : ''}`
于 2018-11-16T18:05:37.210 回答
6

对于这个小例子来说,这可能有点过头了,但是 Tagged 模板函数提供了一个很好的通用解决方案,可以在保持模板字符串干净的同时提供惊人的灵活性。例如,这里通常会删除未定义变量之前的文本:

function f(str ,...variables){
  return variables.reduce((res, v, i) => v ? res + str[i] + v: res, '')
}
let x, y, z;

x = "test"
y = "test2"

// both defined
console.log(f`${x} + ${y}`)

// only one:
console.log(f`${x} + ${z}`)

// random text:
console.log(f`${x} with ${z} and ${y}`)

由于它将所有内容都传递给函数,因此您几乎可以执行任何您想要的逻辑,同时仍然具有可读的字符串。在MDN 页面的中途有一些关于 template literals 的文档。

于 2018-11-16T18:12:10.580 回答
5

从技术上讲,您可以嵌套这些模板字符串,它并不漂亮,但这有效

let templateString = `${y ? `${x} ${y}`: `${x}`}`;

不过,我会使用第一条评论中的解决方案。

于 2018-11-16T17:57:04.283 回答
3

您还可以在表达式中使用函数

这是一个例子

let x, y;

x = 'test'
y = undefined;

let templateString = `${x} ${y}`;

function fn(value1,value2) { return value2? (value1 + ' ' + value2) : value1 }
console.log('when undefined =',`${fn(x,y)}`);


x = 'test'
y = 'test1';

console.log('when not undefined = ',`${fn(x,y)}`);

参考

于 2018-11-16T18:10:30.450 回答
2

甚至更好

const templateString = `${x} ${y ?? ''}`.trim();
于 2019-03-08T12:47:55.333 回答