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