- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)& e7 ~5 V/ F. d
算法:7 ?) x5 G9 y6 O$ `) K; [/ i6 I
英文是单字节字符,中文是双字节字符,# i! r- w8 v+ u& l4 |
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
- P! ~' ~+ B7 O9 @ j, |, Z+ ]0 }4 ?# }
假设n个字符里面,有 k个英文单字,i个中文双字0 [ }5 _5 N) N
那么截取的时候只用考虑最右边的i个的字符, L5 N0 X4 k! Z8 X+ m
' p5 ]3 e2 T8 g4 A$ c8 H. f3 P assume 左边都是英文单字的话,那右边的就全是中文;
) @$ U. i g. V- @9 `7 i" f 如果全是中文,那么有几个中文 就截取几个字符
# i5 U# O4 R0 d1 N5 W5 ^! _/ j: J7 |) J2 }) o
迭代的函数 输入应该是字符串,输出应该是左起的n个字符
/ L: ^( x! r3 j迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现): } Z& _, R- k3 x
3 B7 @0 v4 E( x9 _
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代( I* [' n( O7 x! {. `& C
-------------------------------------------------------------------------------------------------------$ |2 e2 c% N# z" y+ k8 y3 Z
if(!String.prototype.leftB){ 5 Z% d/ n1 x: q" `
String.prototype.leftB = function(n){ //n=75 W' q6 \- z/ _ q3 R T9 M( C4 E# V, G! A
var s = this, //s="ilove我自己"
$ w: L: r K% y- j$ m* d$ ]+ Hs2 = s.slice(0, n), //s2="ilove我自"# U) |' n2 x+ w. f- O" h+ O6 ?
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=94 z8 o" R% l+ r3 _) I$ p$ e' B
if (i <= n) { , |9 L. K* U! |* f% q8 e: W9 n
return s2; k
1 ?1 Q7 ~! h4 m/ }; T$ b6 G}
- x. ~- f# t( ^ \, G, V: Di -= s2.length;// i=9-7=2 , n =7,几个中文
! \/ I( F7 m- s( j0 \switch (i) { : ? k# I) K- h( b% N7 h
case 0: return s2; //全是单字节
) t J# n, Y% R' Zcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
. o- H U% P6 r% V: `& h; u) edefault:
7 x y; r6 N% e, d- wvar k = n - i, //k=7-2=5,几个英文字
7 J3 K" B# N% q( a, W& d P7 Os3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
0 j7 \2 n+ I. D; e* fj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数( `7 h9 w$ z" g; Z4 l
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!2 H ?9 F1 E0 h- v) c; s- j
} 7 D* E! }6 M/ P; b$ S; p5 k
} ) M, W* u' a# W& s( t* w
}1 V0 ~9 H. {9 R" Z+ _6 F4 D% _. N
-----------------------------------------------------------------------------------------------------------------
$ i) ~; }. f- C* K# e8 `: m2 P+ k+ z$ kvar stringify = function (obj) {( H0 @# X9 O" N* q
var t = typeof (obj);
" Z& t5 A1 d, S) U { if (t != "object" || obj === null) {
& W6 B- S2 c) {* i7 F6 o // simple data type
' d' C k% e9 M if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
9 [9 ?' _" |, }- Y+ H8 S: V return String(obj);. b: ]+ r% x$ G) s
} else {3 m! t0 [" w5 {* w( C2 r
// recurse array or object1 x2 L. l Q; W9 i) T
var n, v, json = [], arr = (obj && obj.constructor == Array);
& N+ g- C- n8 U" I2 H) p# n
& `5 d4 B( Z$ N // fix.
' [% ]/ n7 N. y var self = stringify;" i, w! r" [8 D; m* e
0 P2 E0 P+ L) {5 x" r) P5 h( t" k+ k for (n in obj) {9 {# k' `# E" F
v = obj[n];) A2 m$ w( K; C! W# H+ z
t = typeof(v);3 h- {# X! R6 v' E3 Z' j& g
if (obj.hasOwnProperty(n)) {( D" N) Q6 z q$ z
if (t == "string") {
$ i; n# o7 y. y+ u v = '"' + v + '"'; 8 L/ s( c- L4 G8 B9 r( f
} else if (t == "object" && v !== null) {$ o) z1 J6 S& A t; | Y
v = self(v);
# ~1 l) W* @7 }1 T: \/ |) H% J$ ` }/ e% G n( l* {& v/ `: k
json.push((arr ? "" : '"' + n + '":') + String(v));
7 o/ e1 e" `) K5 i8 ` }3 e& z+ K+ y$ a4 k8 e9 X8 t
}- _& S7 q* n. O
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");* H# \# o: ?! M4 l$ M. ]
}
p9 X8 u# i+ i$ S B& [* }; G};
8 E" {- H/ h* i
5 Y# d0 d8 k6 g) x! n+ p; e |
zan
|