- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)1 A8 H6 f J0 c0 c( u# t. A
算法:4 Q4 S% z2 Z; P) R- c
英文是单字节字符,中文是双字节字符,; }7 l; A0 [4 q( F6 @
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源$ z: ^5 q& S+ y/ u% B: w l" j
1 d8 R, P1 a4 H. ?
假设n个字符里面,有 k个英文单字,i个中文双字+ a; @. M9 S# y
那么截取的时候只用考虑最右边的i个的字符1 D7 h, s' }4 h% Q! C6 z
2 J, U2 O% O# y2 x' X assume 左边都是英文单字的话,那右边的就全是中文;
3 z# ]7 H4 j& @. O' J1 `7 ^ 如果全是中文,那么有几个中文 就截取几个字符
8 D+ {( Q" X/ S9 Z! V8 i, y+ p& b: n1 Z6 [% n# |, e
迭代的函数 输入应该是字符串,输出应该是左起的n个字符
+ G Z# z2 Z, G2 g, ?. U迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)) _+ X! L+ n8 ?1 F8 o- }
- x6 b0 }0 p2 ] W' P
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代) h5 E* w/ p, l! @8 o
-------------------------------------------------------------------------------------------------------
( v0 Y7 Y; f1 x# k2 Sif(!String.prototype.leftB){
) d- U- E6 j' I; n# _String.prototype.leftB = function(n){ //n=7
- G3 ?7 w1 }* t }var s = this, //s="ilove我自己"
. {* n8 a9 i: I# G- v6 Ds2 = s.slice(0, n), //s2="ilove我自"# @- W8 f5 C$ `5 A* O
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=92 q. E, H" Q/ d
if (i <= n) { & F' N- [1 ?& \5 d
return s2; k
0 i; w( F* t) @. a+ P} ) h, Q' c" a) ~! x
i -= s2.length;// i=9-7=2 , n =7,几个中文
3 Z0 C. ]- R; H5 h1 I% S$ e5 }switch (i) { 0 L1 {2 J }2 q: ^* @) E% s2 u% L7 s
case 0: return s2; //全是单字节* f% M8 @* A2 n8 g3 V, z
case n: return s.slice(0, n >> 1); //全是双字节,比如中文
& J% R1 |( ^9 t$ I) K0 @% H, Fdefault:
6 ?- m9 {/ O2 @) ?2 t- avar k = n - i, //k=7-2=5,几个英文字
0 t- T+ W+ P6 b- c E2 O+ H% qs3 = s.slice(k, n), //s.slice(5, 7) s3=我自": K( I4 t z8 e# P, X( \
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
8 v, {2 j, t3 Ireturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!3 f* d' U. Q$ f6 |; e# f. I' F
} ) z6 P( b" v7 K3 ?- @
}
]$ N9 Z6 T- ~# f7 w8 b}
$ D0 h' Z1 t6 G-----------------------------------------------------------------------------------------------------------------3 |' m9 ~0 v5 U0 f: d8 k* f
var stringify = function (obj) {
9 r3 }, ]( m5 r( p8 }6 N var t = typeof (obj);
1 e6 a3 a* Q# B) z if (t != "object" || obj === null) {
$ s/ U& Y! w/ |; o7 [( z // simple data type
i! v" Q, \" i% f: u& N2 w H if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
9 C$ I) l" q/ e7 ^ return String(obj);- @8 F1 G. p) n# P
} else {
1 N3 `' ?( T9 W: b @! G0 o; \ // recurse array or object
8 ? ]: a9 {3 p0 A var n, v, json = [], arr = (obj && obj.constructor == Array);: `! c# U: n& G3 y
p; u2 q# ?7 I1 A# e) M7 L' F // fix.
8 C( p9 N9 C* \/ [2 D( N var self = stringify;
% l) e- b- l! X
4 {. c& l7 I9 x for (n in obj) {4 e I) H+ Y6 a8 v' U1 `
v = obj[n];
! ^+ k8 A5 ?& e+ e3 Q$ e+ t t = typeof(v);
3 \4 I/ D3 \. S! l if (obj.hasOwnProperty(n)) {
2 W7 ^: R2 {4 b if (t == "string") {3 v+ `3 K# K7 R; S/ O2 H* C
v = '"' + v + '"';
: z) z2 p, H( \. E } else if (t == "object" && v !== null) {- k: M% g: }0 t* p+ b) @
v = self(v);, U) D8 D/ S! g/ P% W; D
} e) k/ J$ n( d6 i" e1 e# H
json.push((arr ? "" : '"' + n + '":') + String(v));
9 u" r( b" X+ L6 A- K3 |* D, ~ }( F1 O% m( d; c% R
}
, h" D' P0 O, ~ D return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");7 k3 R6 H/ ~% U3 a! y0 A$ H
}
& `$ X" Y' g! M& C! b+ z6 M};
! K& q0 J. A, B+ R
0 X9 t' `5 y- N/ `9 G0 Q |
zan
|