Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

lodash源码分析之trim #339

Open
HeftyKoo opened this issue May 30, 2020 · 0 comments
Open

lodash源码分析之trim #339

HeftyKoo opened this issue May 30, 2020 · 0 comments
Labels
api 暴露出来的接口 系列文章

Comments

@HeftyKoo
Copy link
Owner

本文为读 lodash 源码的第三百三十八篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash

gitbook也会同步仓库的更新,gitbook地址:pocket-lodash

依赖

import castSlice from './.internal/castSlice.js'
import charsEndIndex from './.internal/charsEndIndex.js'
import charsStartIndex from './.internal/charsStartIndex.js'
import stringToArray from './.internal/stringToArray.js'

《lodash源码分析之castSlice》

《lodash源码分析之charsEndIndex》

《lodash源码分析之charsStartIndex》

《lodash源码分析之stringToArray》

源码分析

trim 用来去除字符串 string 前后两端指定的字符串 chars ,如果没有指定 chars ,则 chars 默认为空格,即效果和字符串的原生方法 trim 一样。

源码如下:

function trim(string, chars) {
  if (string && chars === undefined) {
    return string.trim()
  }
  if (!string || !chars) {
    return (string || '')
  }
  const strSymbols = stringToArray(string)
  const chrSymbols = stringToArray(chars)
  const start = charsStartIndex(strSymbols, chrSymbols)
  const end = charsEndIndex(strSymbols, chrSymbols) + 1

  return castSlice(strSymbols, start, end).join('')
}

处理chars没传的情况

if (string && chars === undefined) {
  return string.trim()
}

可以看到,chars 没传的时候,其实就是直接调用字符串的原生方法 trim 来移除前后两端的空格。

处理字符串或chars为假值的情况

if (!string || !chars) {
  return (string || '')
}

字符串或者 chars 为假值时,前后没字符可以移除,直接返回原字符串,如果原字符串为假值,则转换成空字符串。

移除前后指定的字符串

const strSymbols = stringToArray(string)
const chrSymbols = stringToArray(chars)
const start = charsStartIndex(strSymbols, chrSymbols)
const end = charsEndIndex(strSymbols, chrSymbols) + 1

return castSlice(strSymbols, start, end).join('')

要移除前后在 chars 中的字符,只要找到前面第一个不在 chars 中的字符的位置,和后面第一个不在 chars 中字符的位置,将前后两个位置的字符截取出来即可。

这里先使用 stringToArraystringchars 都转换成数组,再调用 charsStartIndex 找出前面第一个不在 chars 中字符的位置,调用 charsEndIndex 找出后面第一个不在 chars 中字符的位置。

再调用 castSlice 截取出这两个位置的字符,这里截取出来的是一个字符数组,再使用 join 来拼接成字符串。

License

署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)

最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:

作者:对角另一面

@HeftyKoo HeftyKoo added 系列文章 api 暴露出来的接口 labels May 30, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api 暴露出来的接口 系列文章
Projects
None yet
Development

No branches or pull requests

1 participant