- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)/ }' Q0 Y7 R, p. k: x
算法:" P+ T- Z6 Y2 M& s3 @
英文是单字节字符,中文是双字节字符,
/ C7 y* M0 _/ b* |) m 如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源, m8 ^5 Y* d& ~" J) r
1 L5 E, a8 I! c9 g8 c0 R0 E 假设n个字符里面,有 k个英文单字,i个中文双字/ Y% G( p8 n; T! J* {
那么截取的时候只用考虑最右边的i个的字符
/ I- E% ?" ^! _7 m1 g$ C2 s; z
/ r% E+ D. Q5 p, [+ A: a assume 左边都是英文单字的话,那右边的就全是中文;) e% J3 W, G# O% w4 X* R2 _; G7 I
如果全是中文,那么有几个中文 就截取几个字符) h( G# D0 X" _; i( q
( z6 g1 c; o0 J7 W; j迭代的函数 输入应该是字符串,输出应该是左起的n个字符
4 C1 H- }! {2 t- } A: g/ E4 z+ `迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
& s( u8 S3 ~/ {9 k7 b+ `
4 ^. U% t& m4 U: U迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
/ I% n9 f! i4 x: n/ g4 d* F-------------------------------------------------------------------------------------------------------
5 m6 z3 \- M. S; o% Uif(!String.prototype.leftB){ 8 Z& h7 G( C. f, S
String.prototype.leftB = function(n){ //n=7" i5 b" H0 Y# ?% i: _! o1 L/ M! u0 Y6 o
var s = this, //s="ilove我自己"4 R" d) m+ n' }% h/ U/ R+ S
s2 = s.slice(0, n), //s2="ilove我自"
# q9 [; k6 u( D. j6 X0 t- T5 \i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9& N) e d4 s8 t- Y
if (i <= n) { / @9 @$ G/ N) C W5 x- r- x
return s2; k
$ c5 L( e4 @$ i9 \4 p}
+ T) f- s. t' V5 a1 c7 X1 Ki -= s2.length;// i=9-7=2 , n =7,几个中文9 s! r* s D/ a
switch (i) {
7 E' q" b( X- v4 W, @case 0: return s2; //全是单字节6 e, T/ ]$ V+ M$ h& X
case n: return s.slice(0, n >> 1); //全是双字节,比如中文; P( V3 Z) G/ b# `3 q* D, Z
default:
3 \7 E: ~. T7 q, `var k = n - i, //k=7-2=5,几个英文字
A! x0 P1 m& X* f- b8 S2 zs3 = s.slice(k, n), //s.slice(5, 7) s3=我自"0 a4 y% O( U" Z: G, u
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
3 \$ Q5 `& _; C% Areturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!5 V9 [1 u; X% A# v
}
4 _1 I- F4 c9 _ @4 S2 M% Z2 Y} * J$ I8 m* W# H$ f- Z
}/ D2 W, y4 G W1 B C! b. N3 _
-----------------------------------------------------------------------------------------------------------------
6 Y& X. Z" ^2 {+ b- E- M" Wvar stringify = function (obj) {) R# }! {8 `' L4 o& Q
var t = typeof (obj);
- O. [& `6 `9 ?, Y. `) r4 ^* m1 X9 L; ? if (t != "object" || obj === null) {' k. E; k9 y0 I! K! @: p
// simple data type* K% N; D6 z. i! `
if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
( \+ ?& r, l- }+ M! `7 _ return String(obj);* {+ |) }. M9 Y4 x, u
} else {
7 a& G1 A; A) [* q# F // recurse array or object6 i# |' ]; a m; ]( `
var n, v, json = [], arr = (obj && obj.constructor == Array);
6 R- c* w( q+ `# N$ f" V' E' L" }+ u
// fix.
+ O% b. I+ k: r, v$ a# l$ v var self = stringify;- o7 Y( Q. W. `/ `3 V
4 L$ G$ @+ ^% V- q for (n in obj) {8 h1 a" _- \8 l' |
v = obj[n];
0 F; `" J- H1 s7 S2 f/ Q, g t = typeof(v);) Y" r% V0 y5 @2 g
if (obj.hasOwnProperty(n)) {9 y2 f7 E" ?$ y" g& v5 V
if (t == "string") {
% S, \, X( O) x+ i; U0 A8 x v = '"' + v + '"'; & j+ x/ m8 k% Z7 g- S" |
} else if (t == "object" && v !== null) {& n1 M. d: _( Y+ A p7 h
v = self(v);
, e! B( h# \7 I* o }
3 [0 O, u! q: I# W2 F; h9 _ json.push((arr ? "" : '"' + n + '":') + String(v));
( T* l$ m0 M( Z# Q9 Y }
% f; V& A e3 a8 V }0 H8 p% _0 _8 q2 U3 Q |/ v/ X
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
, L4 ]( }# Z, k* h. _" } }, J/ G+ N n( w( y( f2 p
};
7 [- k3 ` ^! _% V
0 q3 K: v9 @+ p/ W( i |
zan
|