- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
% S: P$ q% ~" h+ K7 Y算法:
$ a. N- M' ~9 [ { 英文是单字节字符,中文是双字节字符,; i. `" z1 J" }9 G
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源& r6 m* m4 s/ S: N2 _+ f/ v8 l+ m
5 o8 X+ W. Z6 s' v5 C/ p
假设n个字符里面,有 k个英文单字,i个中文双字, X+ l! X$ u% G9 [
那么截取的时候只用考虑最右边的i个的字符
/ r! U! ^! {# v" ]
s2 r6 N1 W# w! @ assume 左边都是英文单字的话,那右边的就全是中文;: R) s: y- L$ `. {; m; {
如果全是中文,那么有几个中文 就截取几个字符
; b5 k- ~8 a! ]% ]$ @' L/ ~
1 |9 i t9 G3 W迭代的函数 输入应该是字符串,输出应该是左起的n个字符$ |. w4 w3 B& ]) w
迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)6 [6 `2 v3 F m, y/ B
" x4 }1 |* l9 N9 _) f. m
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
5 Z9 D0 j. h- U7 C-------------------------------------------------------------------------------------------------------
E5 O2 h; ^6 A0 @, fif(!String.prototype.leftB){ # W2 U7 ]; {; G c! n O8 z
String.prototype.leftB = function(n){ //n=7+ {' H. S( @& i/ r1 H
var s = this, //s="ilove我自己"' D' r, @+ X- {. x& b
s2 = s.slice(0, n), //s2="ilove我自"9 j( l( a6 @9 u3 }1 a W
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
7 @3 I: w$ F5 {: @4 N1 x$ Vif (i <= n) { " ~4 T' r: g c9 T, b, a! }
return s2; k
Q& D2 l4 p! W/ a; {7 k} % U" e% D+ o7 Z
i -= s2.length;// i=9-7=2 , n =7,几个中文
. B5 d5 s0 t0 p* S/ Wswitch (i) { & A7 D H7 \$ z. l) p1 G; k
case 0: return s2; //全是单字节3 Z" g3 E' a. z
case n: return s.slice(0, n >> 1); //全是双字节,比如中文; N# {. |6 ~% q/ A. Q, O( G7 f( `; C
default: 8 T9 T9 f; S6 q' U' u
var k = n - i, //k=7-2=5,几个英文字" @8 |8 Q# p7 i( ^6 @
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
( G, y) h! |6 z7 k% y, g2 aj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数/ f- A% h3 `! S) U# ?
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
6 ]/ b7 o# g. O3 t! K}
1 n$ w% C7 L4 K" h4 }}
- o( o# K n# |2 n. A9 k) l}) v8 ? z6 E/ J5 S- T; ?& Q5 `
-----------------------------------------------------------------------------------------------------------------; \8 w! e' N1 w" M, v
var stringify = function (obj) {% B" [" B5 W. j4 l8 c
var t = typeof (obj);2 |; o# U- W3 t
if (t != "object" || obj === null) {, ?1 Q+ b4 n. K3 Y( y" W% m9 b
// simple data type
6 k- {1 {5 S) g; r- l1 d* C if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
. {; A0 j# |! l7 \8 k, I return String(obj);, G$ W7 z0 X' _5 i6 O# {
} else {! t/ S( u4 Q1 B8 }
// recurse array or object
6 ?, \8 Q7 l9 Z+ {5 K var n, v, json = [], arr = (obj && obj.constructor == Array);/ v/ M. f d/ i% m
7 L0 A6 x8 z# O // fix.
5 `' n5 T0 D$ Q& ` v var self = stringify;
0 `+ H0 l% R" s3 @/ W0 C/ @2 G) L, Z+ Q
for (n in obj) {% w: c( D0 z( \ H
v = obj[n];! O1 T2 n% _5 i9 M% D
t = typeof(v);* U) t: `. d/ ?2 L x/ j9 K$ @
if (obj.hasOwnProperty(n)) {1 a8 ~* O& \ b) v4 q$ I
if (t == "string") {
2 @5 g, U' ?2 L7 d v = '"' + v + '"';
$ w5 v6 p$ f- G) S } else if (t == "object" && v !== null) {
) v2 x/ n3 g1 r' a/ c v = self(v);
n$ A# A+ W. B/ g0 v' z5 S5 B }
# q' ~7 c" e8 C9 ?! Y) ^3 r json.push((arr ? "" : '"' + n + '":') + String(v));
`3 Z% o3 w' v% K% u }; J$ D8 ?0 J1 m( X8 R# P" p: m
}
1 [6 I0 o5 x$ I' A" o return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");: h! w( I0 A) }, F- f9 l
}% A% B) U0 b; V6 q
};
" g6 F, h5 D( M7 e% r& V( O( O: K9 @ Y# g
|
zan
|