- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)$ ~/ H2 v; C8 r( G R0 ^
算法:
, k3 ]6 A4 u! g) f1 O 英文是单字节字符,中文是双字节字符,
/ y5 n; v0 o+ D( \' _9 T 如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
' B/ H4 i/ f! j' i
% r G' X" B3 m! X( y 假设n个字符里面,有 k个英文单字,i个中文双字
0 u, y4 T6 b6 v$ ? 那么截取的时候只用考虑最右边的i个的字符) F2 B1 y. U, s( C: Y6 o7 d
5 j' K. ]" T- z4 U1 a' h! S assume 左边都是英文单字的话,那右边的就全是中文;6 t+ A* u$ U! e0 Z- |
如果全是中文,那么有几个中文 就截取几个字符! i4 T2 m* k0 N7 w$ p8 R+ E
1 }. q! q3 m! L- a$ q迭代的函数 输入应该是字符串,输出应该是左起的n个字符) I5 E& S# m* `
迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)# h7 `/ a! B# G7 A8 d' X
' D; x1 M8 _- F) o. q! H0 O Q迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代, w7 f# _: G9 }* K8 G+ t* \5 e) [
-------------------------------------------------------------------------------------------------------! {9 N2 I9 Z7 G" Z& t
if(!String.prototype.leftB){ : A9 T6 I% g0 S$ T0 s# J
String.prototype.leftB = function(n){ //n=7
6 b# n% W4 _" r' S' pvar s = this, //s="ilove我自己"6 L) V M) s1 T1 P9 X) e( G' h
s2 = s.slice(0, n), //s2="ilove我自"+ U2 W9 v0 q F0 e* J% f. d
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9- s6 ]- H3 V6 P; H
if (i <= n) {
4 N* R' }' D* H2 ^ U$ |, Sreturn s2; k
3 x4 t0 ^2 z8 v) z: M} 6 H, k. R6 o2 o+ R, _8 u
i -= s2.length;// i=9-7=2 , n =7,几个中文, O J3 k/ A! y! V
switch (i) { 8 B1 p5 Y! @3 U
case 0: return s2; //全是单字节. z) _' q7 R2 S* h
case n: return s.slice(0, n >> 1); //全是双字节,比如中文3 `/ L8 G3 D0 Q$ ~2 F" \
default:
7 Y2 j2 S9 v- ?* ivar k = n - i, //k=7-2=5,几个英文字4 e0 T+ L1 Z1 q3 G5 G
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"! D5 J3 b! ]' O3 ]
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
. j: n& f g. greturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!5 W5 G, c+ {( x" J1 M% e/ }+ D1 I
}
' Q5 _9 \0 O# p: y) y2 e: e} 8 p0 Q; Q W. }+ T* P( X
}9 x2 j' x; b1 b" v# k$ q
-----------------------------------------------------------------------------------------------------------------
7 }. e; J9 ~; ]var stringify = function (obj) {
5 B# }0 J% I. s var t = typeof (obj);
( V. k5 M" f0 I( R) w4 o# F/ M if (t != "object" || obj === null) {; i- `" X% e! g, D
// simple data type6 w8 \* | X0 _2 X, K1 ?; z$ C
if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!5 S0 q/ M) l* I% e' l, l; Q
return String(obj);% V; X; Z5 E% \' e
} else {2 J0 ~$ Q i+ r) J G: j' P
// recurse array or object
' V: U6 E' {9 N var n, v, json = [], arr = (obj && obj.constructor == Array);
. n" q/ v! }2 k2 a4 Z8 W& C( @: y+ r. X
// fix.0 {# L& c$ |) |" |" U* V3 Z
var self = stringify;$ D! m1 T3 U* a, h' C- v
2 K3 Z7 C; [) T7 ?1 K. ? for (n in obj) {; t. x F* j& r+ g! q# Y* i
v = obj[n];& _/ ~1 ^* X. m. g7 |
t = typeof(v);
5 T6 ]4 ~- @) p: G5 z- l4 r if (obj.hasOwnProperty(n)) {: ^2 H- Q8 @) q, e
if (t == "string") {
0 D8 n7 r1 t( _" x& t% f v = '"' + v + '"'; + E# c2 i# ^( J- W- p- f! p
} else if (t == "object" && v !== null) {
6 h5 V# n, g- P& Z v = self(v);
' k+ X2 R9 j% j2 p7 a W2 e2 m, i3 @ }3 _8 }7 h7 x1 U- r+ L: Z- }! ^
json.push((arr ? "" : '"' + n + '":') + String(v));; h0 |3 Z' p. N) x( g7 C' E0 n+ c x
}9 `' R% ]" K* W# t5 X6 K
}8 Q4 }- x# e# E- h2 Y3 H. s# R
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
3 M' V+ G ]4 G) C1 u: p }
4 Y" t+ R1 ~3 e$ Y};
( A& T V4 q5 e4 v7 g, V9 @% f* O' ?. Q9 e3 R% z! `
|
zan
|