- 在线时间
- 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 ?& T' ^- W2 i7 v% ?" }9 ?0 J! R" M
算法:
/ d a# e6 F% ]2 A 英文是单字节字符,中文是双字节字符,$ e! ?4 a! J& B! H; Z/ O1 W1 O* w
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
+ b1 Q; P/ V2 H+ B5 W
3 `7 S1 a+ g5 D, I# d; c 假设n个字符里面,有 k个英文单字,i个中文双字* _' ?$ [2 i8 m! W' g7 H
那么截取的时候只用考虑最右边的i个的字符
5 {, c- Z0 v( ]/ S4 j$ U
7 e& m% R1 }& r6 [/ C* ~6 p assume 左边都是英文单字的话,那右边的就全是中文;7 V% k8 E( g. }$ }- j
如果全是中文,那么有几个中文 就截取几个字符% ?2 B; D! g/ U% a, H
" d) H2 g: Z9 T( a& U) }迭代的函数 输入应该是字符串,输出应该是左起的n个字符
2 F S8 H/ Z/ c) E1 q- o迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现). \- r" e0 X) I( D/ \. I8 i
( I7 W$ Q6 [% G
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
; p# @* l& _' Y: {; F-------------------------------------------------------------------------------------------------------
4 O6 v8 C# E# N$ Iif(!String.prototype.leftB){
) Y( a0 W0 M+ i% @+ a9 L- DString.prototype.leftB = function(n){ //n=77 |2 t% F; k; |0 D" A/ p }
var s = this, //s="ilove我自己"+ u% ~; g: N5 @8 S' }
s2 = s.slice(0, n), //s2="ilove我自"
6 Q" [( y' W2 J1 q( \6 Vi = s2.replace(/[^\x00-\xff]/g, "**").length; //i=92 W& w2 d" M( @* Y* T
if (i <= n) { % ^# @& X- ]5 _6 O$ ]
return s2; k
! k [1 s' H' J2 |/ [5 u- S} # W* {8 W% u/ P( y) ]" `
i -= s2.length;// i=9-7=2 , n =7,几个中文# `- D2 i0 G2 O( B8 C& p6 w
switch (i) {
+ `+ }' w2 J, K \case 0: return s2; //全是单字节6 R3 K1 \5 {. b$ a' i! x
case n: return s.slice(0, n >> 1); //全是双字节,比如中文
- L& j4 b, e4 \- L3 a+ Ldefault: & s! l4 V$ c2 [/ s. S1 X- y8 P
var k = n - i, //k=7-2=5,几个英文字& w. q. ^, P( r8 l# M& O u, @
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"; i& L1 r) D2 c& \( _7 Y7 k
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数) {8 j/ U) W( D, r) x
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
. t- k1 H) Y0 f! p2 B; y! w8 [}
. C: t5 ?% L2 J" T+ t( q}
' X5 n1 G9 ]; r4 s9 O7 N3 x- W8 s}
9 s1 x; b4 c: l: i% O) P" y$ O-----------------------------------------------------------------------------------------------------------------4 s f# U% K6 @# A; |
var stringify = function (obj) {
$ G# [5 m2 r& p8 `2 Q var t = typeof (obj);
% G" T8 i4 Q6 I% j8 f0 R$ w if (t != "object" || obj === null) {
- y6 w9 X) |1 g, X# z. a // simple data type2 q; X- c4 B" C! L
if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
& O4 L; g* U& |2 u/ _( x. l4 u return String(obj);
; r% _ i9 i8 `# A l+ f } else {. _% }; ^' ]; _* G* n
// recurse array or object" H# N. v( f& \" U" @
var n, v, json = [], arr = (obj && obj.constructor == Array);
: ^+ h% o: T2 A) X& [- h, i! U% r* r( ]- ~
// fix.
( G# B1 y, h+ o! i! T var self = stringify;
' V# I" {/ q' S1 m" f/ s. n( V
+ _( P X" G! k) e k5 z for (n in obj) {0 h8 j) U9 @% m: B* \2 {! o0 T7 x
v = obj[n];
" i8 A1 u0 Y+ N9 p: Z) h t = typeof(v);
D2 B8 }: K4 G if (obj.hasOwnProperty(n)) {) F: E1 N$ ]& H4 s
if (t == "string") {
$ L/ W) J+ _ _0 i- T v = '"' + v + '"'; 9 I: ?) e7 m6 R& N# N
} else if (t == "object" && v !== null) {5 {' O9 s) {3 q# h4 g( ~. }# q
v = self(v);( R5 w+ g) o2 e* x& M) s& X
}' u! g6 }$ W9 H$ F
json.push((arr ? "" : '"' + n + '":') + String(v));3 o: n1 Y1 g0 B4 ~
}7 T: z$ s( y* t+ H
}- F b# R9 ~1 Q3 u
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
) J6 t, v( ~: i: S1 J }
: m2 O: p% G% d5 k9 c& I4 \};6 ~6 X5 a( N q% \
5 F+ e/ M. s D# I7 Z3 ^
|
zan
|