- 在线时间
- 3 小时
- 最后登录
- 2015-5-5
- 注册时间
- 2015-4-8
- 听众数
- 10
- 收听数
- 0
- 能力
- 0 分
- 体力
- 92 点
- 威望
- 0 点
- 阅读权限
- 20
- 积分
- 43
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 26
- 主题
- 14
- 精华
- 0
- 分享
- 0
- 好友
- 7
升级   40% TA的每日心情 | 慵懒 2015-5-5 09:46 |
|---|
签到天数: 10 天 [LV.3]偶尔看看II
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
6 _. B7 s% l6 O4 g* J4 q, q& b算法:0 P2 ^8 w1 D' x0 M7 D+ g4 W
英文是单字节字符,中文是双字节字符,
2 M! o1 V/ n2 m* o/ V! U( q 如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
4 A, o% q" A) X/ h' b2 c8 a5 t% O$ F' z; s8 J! a
假设n个字符里面,有 k个英文单字,i个中文双字
6 r) g) l* \" n1 e+ O7 g 那么截取的时候只用考虑最右边的i个的字符/ d5 ^# j) Q6 E4 M$ \
( ~) C8 M" }6 T assume 左边都是英文单字的话,那右边的就全是中文;0 S+ {% T/ O6 B2 R& J7 ]2 a6 i
如果全是中文,那么有几个中文 就截取几个字符- J3 r e( R* e
9 {& ~/ w6 i* Z: s! H
迭代的函数 输入应该是字符串,输出应该是左起的n个字符
" s" [0 A4 z0 S' w迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
! q' z' n$ u2 K" d; A! X2 X5 m, a2 U& V# n( t2 P
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代) G# L# Z H: S
-------------------------------------------------------------------------------------------------------
1 s, N: k/ S8 |4 Xif(!String.prototype.leftB){
8 z- ?) j3 @" E5 l7 b& qString.prototype.leftB = function(n){ //n=7
. m# F" E( A6 S6 jvar s = this, //s="ilove我自己"0 K1 x* y4 T8 L4 p- D
s2 = s.slice(0, n), //s2="ilove我自"
6 [+ n. C$ j: E4 z, L; k4 Ei = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
7 a1 `" P, Y0 x# w% j2 }if (i <= n) {
. A- h! P$ z; z) Freturn s2; k9 Q$ [& i* _5 h# t& a2 {1 {9 @9 ~
} % T3 ~$ \8 [7 I& j& k, c
i -= s2.length;// i=9-7=2 , n =7,几个中文
, x k2 @" M9 k9 j/ }: _switch (i) {
) O, r2 ^0 p5 W2 d2 J f5 Fcase 0: return s2; //全是单字节
4 p2 l+ O: l# [+ Y$ _$ Z6 l8 ?7 N) fcase n: return s.slice(0, n >> 1); //全是双字节,比如中文' t5 q1 x+ E8 w) q- K
default: : ]' G" N' ^6 ?3 G( S4 X, f
var k = n - i, //k=7-2=5,几个英文字 m; ]6 ?$ C+ Q0 O! Z% ~& A
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
4 C) y v) j. nj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数; ~4 N. a" s6 [
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
- m$ e6 [7 ^0 H} , w# ~+ y! a- ~ g9 v
}
' q( V4 `4 v/ P4 c( R; B P7 T3 U: \! w# Q}
; q- \) Q- O+ `; _# e5 g-----------------------------------------------------------------------------------------------------------------
# T( p4 s0 R) ^5 {: t8 v! D# ^var stringify = function (obj) {
6 u" \5 a4 r8 U6 O* O4 t var t = typeof (obj);9 E+ M% J7 L! w: [' ?
if (t != "object" || obj === null) {
6 w/ V" s i0 u0 b0 s0 j K1 V* i // simple data type
@7 i' }, X& m0 S* Q( T- f3 K9 N# P if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
% ~* }/ z9 R6 @& Y0 S) f8 w return String(obj);- J2 ^$ P. i9 ^! ~, t
} else {2 t1 t8 C+ Q. i6 E/ I
// recurse array or object
9 ?3 W" o8 T$ c9 L, h5 m4 T+ x var n, v, json = [], arr = (obj && obj.constructor == Array);
4 V k; n# J% `9 j; u; E
$ d$ ]- u" o3 z6 k2 n3 r // fix.
G2 S. J' Y& z7 A9 _8 S var self = stringify;8 f! d+ ^: U' V M# |; Y
* X2 u& S% X& Z7 C for (n in obj) {4 ?7 @+ o- y0 `9 u
v = obj[n];
% v, g. ^7 o$ w8 x$ D t = typeof(v);% M0 g4 `) A! Q- ^$ g! |0 H" \9 s
if (obj.hasOwnProperty(n)) {
/ T( Q5 `1 n( V# V" g" D2 Y if (t == "string") {2 h& a& \# l3 @
v = '"' + v + '"';
( t- T3 {. R4 q3 o* Z6 C& @+ p" y* G } else if (t == "object" && v !== null) {
- b5 y+ }. e3 ~ v = self(v);8 p! J& g! `0 z4 o% U' K; R& A
}
. }; G: E4 O$ P- S( h json.push((arr ? "" : '"' + n + '":') + String(v));
$ w5 b$ v+ H4 }1 s }
6 {2 [+ {, m! ~3 _. ]7 [- G }
: \4 K3 A o5 b$ U1 M return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
1 o8 t( n9 J {9 g# P. ~ }) W- h2 u$ P3 |* }: \
};3 n) l" V5 {$ N! u8 d
* f% N/ T9 {& a' y |
zan
|