- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)! [% _9 F) |( c K/ ~
算法: @6 Y) O2 {0 K; H; E5 b6 ?! P
英文是单字节字符,中文是双字节字符,6 Q: r9 W! A( T7 b$ r
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
% X; Q6 Q) Y& q6 J2 b7 Z4 D: q- b+ ?: ]5 ?+ p
假设n个字符里面,有 k个英文单字,i个中文双字
( u) E6 c( d. a& p" Z 那么截取的时候只用考虑最右边的i个的字符2 Q9 ?' n5 a8 |! y% C$ d( u
+ Z1 K) l4 y4 @& V' p, m
assume 左边都是英文单字的话,那右边的就全是中文;. N O, f) a% m5 w) W9 a/ J4 R
如果全是中文,那么有几个中文 就截取几个字符
+ ]& M. E5 C0 u! Q: {4 ^0 h
7 C4 ?3 O7 l( u$ }/ C迭代的函数 输入应该是字符串,输出应该是左起的n个字符
" b$ K5 S/ l4 i* d迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
& j/ I, A/ _ A$ L/ t% I. J& Q% F3 d5 `+ D* j& E
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代1 F: c' F) W+ b1 s; G9 M3 }
-------------------------------------------------------------------------------------------------------* i. K+ @. H8 F: M/ g6 r( Q( Y6 j$ h
if(!String.prototype.leftB){
# o$ A9 L, X2 _+ _5 N" }String.prototype.leftB = function(n){ //n=7
9 O1 x/ i- f0 b0 Wvar s = this, //s="ilove我自己"9 a8 P' \9 u& s' t) y3 j; D$ `
s2 = s.slice(0, n), //s2="ilove我自"2 d+ b/ r! h/ U7 G
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9* X$ A% M$ I r/ l8 H" {' O
if (i <= n) { ; v% [+ H0 q5 a8 \9 J7 E) F
return s2; k3 O9 y9 u5 W: o: d8 a
}
( x1 U$ S% z( _, y% I2 Q- Q# j, Ni -= s2.length;// i=9-7=2 , n =7,几个中文% w4 Y' R( x9 U1 K1 w) q7 W" g
switch (i) { ( c$ ]2 ]& H7 a% d, G% n
case 0: return s2; //全是单字节) e$ S' V) N( D" g
case n: return s.slice(0, n >> 1); //全是双字节,比如中文
: t3 }4 [9 g1 b4 B& Rdefault:
/ Z9 }# I( S0 `" y nvar k = n - i, //k=7-2=5,几个英文字: p2 b& t$ X0 @/ s& M9 o) G
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自": Q( P' X: H) a% D0 a
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
- W6 V9 i' u/ dreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!' |$ O3 _4 q+ v; R; x
} + |- w2 m* @: u7 I6 @
} & ?) K/ O1 V. }+ j2 V* }% t+ A- N
}
' m* g- B7 u5 E h5 o" y- |-----------------------------------------------------------------------------------------------------------------: @7 q/ Y: ?1 H2 P
var stringify = function (obj) {8 V; J& W/ x/ u0 j
var t = typeof (obj);9 }* @3 f, |0 e1 h( h+ j& N
if (t != "object" || obj === null) {
3 m0 |2 @$ w% D k( l6 ] // simple data type
, F* j# { U W- z if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!7 ]) J& S& Z2 t! \
return String(obj);* B& `0 d! z P& }0 _/ z
} else {
$ F" v) q( t" R: v6 z- Q // recurse array or object
* N+ z4 y; U7 h9 \! l; a var n, v, json = [], arr = (obj && obj.constructor == Array);
$ j/ N% Y5 M$ }0 r6 w% Q' I) N& O" }# p' N |
// fix.% |, w+ N, [ m* O1 v2 o* p
var self = stringify;
% }/ e% a0 P. t# O- l! v5 ~2 h& |, m8 x4 H/ G3 _1 i* D
for (n in obj) {/ O$ L+ r6 D9 q/ P# E) N4 L$ F1 O
v = obj[n];
& `- L) H; I& Y9 r/ c t = typeof(v);
) M- M P5 y8 G. L if (obj.hasOwnProperty(n)) {1 ?; L5 D& X5 C9 G6 ~- j
if (t == "string") {
- Y) G- g. k0 V# [, Z v = '"' + v + '"';
9 O8 Z% J4 F; E8 Q } else if (t == "object" && v !== null) {
' y$ D9 F5 @* y8 L v = self(v);; ~: {, q: w1 C, [
}. I4 C' S5 V4 Q" a& K1 }& N
json.push((arr ? "" : '"' + n + '":') + String(v));
# _- H& h8 a C6 C! q& w }( E! H2 h, |* c; r
}
$ `* E5 l. P) q return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");9 R& \2 d- B$ \/ R/ V" F% V% w
}
: x0 C3 [& s3 C( t) y};
- `3 }2 Q, b# c4 m6 {9 k
0 g" j' x/ B, B9 m& i- J |
zan
|