- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)/ g% q* @$ r) u6 D# }/ R8 [
算法:
( N* p: H; k/ N5 T" a1 W" Z 英文是单字节字符,中文是双字节字符,. \9 s' K/ F0 w0 K1 j: i
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
* E5 X& q6 k4 }6 n
* t; {4 d! g2 G% [9 {! c' @ 假设n个字符里面,有 k个英文单字,i个中文双字! D. G1 Q3 _* J, {
那么截取的时候只用考虑最右边的i个的字符
. I+ |8 X* e( W# j3 A3 |1 i
* } C+ @& w4 P assume 左边都是英文单字的话,那右边的就全是中文;5 @" t) _ m: |1 r* ~" J! @4 U
如果全是中文,那么有几个中文 就截取几个字符' a0 ^) k( q) @* R. k9 c+ y
; a+ r( v8 L: ^3 Z0 U) ?3 g4 V
迭代的函数 输入应该是字符串,输出应该是左起的n个字符
5 b7 \- c, ]/ s9 Z7 z迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
! W, U& Q* e: U2 l
) j7 H# W( z6 ], v迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代/ x" k- P, q. C6 ~
-------------------------------------------------------------------------------------------------------
$ \( F- Y8 t6 J* Q- o) }: Hif(!String.prototype.leftB){ 1 s, P" |# ~1 f, U" ]; `, T
String.prototype.leftB = function(n){ //n=70 C9 t% \; }! |4 W8 O9 }
var s = this, //s="ilove我自己"* v- q# ~+ X, I3 @ W1 X
s2 = s.slice(0, n), //s2="ilove我自"
: z8 f/ [0 x, h& Ri = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
3 O8 @4 O! C9 ]# H6 Vif (i <= n) {
) Q! ?0 v$ R. c. E& [+ Xreturn s2; k
1 I* R* [0 m/ |5 B0 c) e} ) O( E- x# z) k4 {5 A7 k- w- I
i -= s2.length;// i=9-7=2 , n =7,几个中文
9 a e7 s/ [2 @& U0 s5 R* R' U3 Uswitch (i) { % z/ B) w* }9 K& `+ I+ z
case 0: return s2; //全是单字节7 O5 `3 r: C6 u, X1 e2 z
case n: return s.slice(0, n >> 1); //全是双字节,比如中文7 G/ _1 T( p7 {
default:
& C' k5 u7 l+ r9 A/ J! s. {% {# o5 [var k = n - i, //k=7-2=5,几个英文字$ z7 p8 d9 [; B6 ]
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自" c/ V/ W' Y' f
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数; ]7 J) R+ t2 E" e
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
/ ^! k) w* ~8 V C" ~/ }' i5 K3 i/ k}
2 }' E8 ]$ Z: k B- {, H} ( T$ n/ K. G' _/ c
}% Q- J" H( l$ O6 M$ A. I
-----------------------------------------------------------------------------------------------------------------
6 w% `' D4 b- Tvar stringify = function (obj) {: c# H! H( r/ D: |! Q* B Q
var t = typeof (obj);% J. Q( J j/ i; y- y8 a
if (t != "object" || obj === null) {5 @2 |8 h% T1 c' P
// simple data type: V. W% e5 Z- N
if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!+ g/ b) d: H8 B$ ^8 B/ v
return String(obj);
1 u6 l0 l" p) W8 [" C* k } else {
, _: X. s8 q( m$ p3 ^, T // recurse array or object
! D7 p3 |3 Z! y/ c1 V) i, Y$ r var n, v, json = [], arr = (obj && obj.constructor == Array);4 M4 I9 E- u1 [. m
6 s$ G0 w% x( p5 d0 Q- V+ S. H5 P6 r // fix.
0 A3 g1 Q9 E1 J1 A" c/ L var self = stringify;
1 {$ u9 a* J+ @: [( O" L
' M- K Z+ j$ ?' G for (n in obj) {1 e ~9 N) h; k0 X$ s! O
v = obj[n];( X. U5 O0 O+ x2 O3 {5 T
t = typeof(v);
i: z: }! z/ Z" B. ? if (obj.hasOwnProperty(n)) {
* i8 r3 ]1 H2 [6 w) B) d/ a6 m if (t == "string") {
/ H7 l) T9 @. T/ [" i! ?0 R7 J, m2 F v = '"' + v + '"'; # ?1 ?6 j% T! G" X& x2 d
} else if (t == "object" && v !== null) {0 {7 p* {3 r3 u, c
v = self(v);
) q' ~3 `. `& k }: @% q) j9 O& N/ L7 V
json.push((arr ? "" : '"' + n + '":') + String(v));
$ |' b. \; {4 D# ?( x% t }5 `5 a- Y) K; u: I& `( a( r
}
' W4 _3 [4 p3 y return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
7 C* p! r5 L7 g6 e' Q }
% H. j5 H/ G; g};
* Y% S6 @4 k, Y# U2 @! W. ?5 f2 c+ c# S6 Y! B
|
zan
|