截断字符串 (Truncate a string)
题目链接
问题解释
基本解法
思路提示
- 首先应该想到,截取的逻辑大致分为两种情况:
- 截取后,带
...
- 截取后不带
...
,这种情况其实就是输出str
本身
- 截取后,带
- 进一步考虑第一种情况,又分为两种:
num > 3
的时候,需要少截取三位,因为...
的长度会计入结果长度num < 3
的时候,正常截取,并把...
加到结尾
- 对于带
...
和不带...
的情况,判断依据是num
是否大于str.length
- 先想清楚这些,代码就很好写了
参考链接
代码
1 | function truncate(str, num) { |
解释
- 由于这道题目逻辑层次嵌套比较复杂,因此我决定不省略
else
了 - 用
substr
或者slice
都是没问题的。而且这道题是从 0 开始,所以两个方法的第二个参数都为num
- 由于是根据长度来决定,因此我首先考虑到的是用
substr
中级解法 - 用三元运算符合并逻辑
代码
1 | function truncate(str, num) { |
解释
- 嗯,这并不算是什么优化,对运算速度并没有什么提升,而且可能有些朋友认为可读性很差
- 有些朋友会说,既然都用了三元,为什么不把
str.length > num
也合并成三元?原因很简单,我个人很反对三元嵌套 - 我们先来读一下代码。对于
str.length < num
的情况,也就是num
比str
的长度还要大,那么我们就直接返回str
。这个没毛病,和上面的思路一样 - 通过基本答案中的代码,可以观察到,对于
num
大于 3 的判断,我们只是改变了substr
的第二个参数,除此之外没有任何其他改变 - 因此,我们需要干的事就是,当
num
大于 3 的时候,我们把第二个参数设置为num - 3
,否则就用num
。这就是上面三元表达式的意思 - 三元表达式
a ? b : c
,意思就是当a
成立,我们就返回b
,否则返回c
,就这么简单。相当于
1 | if (a) { |