- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)5 G) C% B: I( J" Y# D- b+ `! c* c! N
算法:4 q$ |/ I& n+ e1 s. {5 |( r
英文是单字节字符,中文是双字节字符,
5 Y9 W8 j/ R. w 如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源3 g/ Y( [1 r) N& P: W C4 ~
1 d' T2 b8 d2 S5 Q: S. j
假设n个字符里面,有 k个英文单字,i个中文双字9 K9 M) i9 J( C
那么截取的时候只用考虑最右边的i个的字符
; e" |' ^+ h" m z! ]/ X9 H+ r; g7 y; S/ p: h
assume 左边都是英文单字的话,那右边的就全是中文;7 ?, N( e; D, u9 c, F X1 `
如果全是中文,那么有几个中文 就截取几个字符
8 @5 T$ k8 W" u% L/ ^" [; M6 ?- {# d+ N. {* t$ [
迭代的函数 输入应该是字符串,输出应该是左起的n个字符7 a# Q6 F, u6 y6 N& \1 Y2 B0 ^1 c5 y% K* g4 Z
迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
& Z& o( X; u# e! z
+ s% Q" B0 q9 ?- x4 l6 u+ z迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
4 g. u7 P- w6 m% c& u( s, C! [+ ]6 z-------------------------------------------------------------------------------------------------------
# Y* w3 O" I* w: j0 _1 Zif(!String.prototype.leftB){ $ C5 m; E! @2 h/ {
String.prototype.leftB = function(n){ //n=7
2 e ]2 D- z6 B* N; Gvar s = this, //s="ilove我自己"3 c9 o* o1 I0 G; E) m9 ]' N) m; ^7 k
s2 = s.slice(0, n), //s2="ilove我自"
' V! s! o) p, ~, W5 xi = s2.replace(/[^\x00-\xff]/g, "**").length; //i=91 v) p* X9 F k7 z- E6 L: a
if (i <= n) { + u4 W* S4 \. p( _9 U/ ~: u
return s2; k
# E1 `' @. b- X2 v7 [; A9 j3 b} ) @* u3 L( [& c( _$ s7 K# J3 W
i -= s2.length;// i=9-7=2 , n =7,几个中文
2 S# t0 f+ w3 x9 G+ nswitch (i) { , {' h) E! s/ d( Q
case 0: return s2; //全是单字节
; F5 `% N5 |+ A: W2 ?( z2 Zcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
5 `8 h( `8 _0 @/ Ydefault: 3 J' {6 i' p# h( G* ^% R
var k = n - i, //k=7-2=5,几个英文字
5 y! f- O- @. z5 a& ~- m6 ds3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
4 e Z( ~: B/ \j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数/ m1 ?$ Y% A5 s; S5 Y) q
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!# W$ Z$ m0 r% S% p' k1 {
}
; L$ w3 m9 V' e8 r) C0 ^& J7 D7 q" [}
$ Z4 |4 B/ t7 h7 l8 @' M}! j8 [" K7 @+ d* J
-----------------------------------------------------------------------------------------------------------------
& [# U, u1 y- x; D% bvar stringify = function (obj) {/ N) x! W J% v9 r: l
var t = typeof (obj);4 b- b5 J# y, H) e4 Z! X M% b+ p
if (t != "object" || obj === null) {) e( f7 J- M" t; v5 Z6 a
// simple data type
$ q4 W& d1 D2 l if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
# w$ C% ^' N. `4 {& S return String(obj);
/ C+ y' T8 F+ o5 D+ m } else {
; m5 }( H: }% S( k6 i, n // recurse array or object6 u/ `4 r2 T( {0 B+ A2 g
var n, v, json = [], arr = (obj && obj.constructor == Array);
: R2 N6 V e; a5 A l1 {) B& R% K( L o; R" b
// fix.& L7 b. E4 f6 M" }6 }
var self = stringify;
- o7 Z c$ Z% J" ]6 o T5 s, \
2 T4 v0 j- v* W for (n in obj) {1 L6 t* F. P6 U% @& L& M( V+ a
v = obj[n];4 F5 r' a' d" \ v7 z6 }5 T
t = typeof(v);5 o6 N' ]$ X& T4 {
if (obj.hasOwnProperty(n)) {
# J- T4 ]" [& Q# p [& `- s2 e( _" G if (t == "string") {4 j/ {) i- Z; I' M, @) e! D7 v7 w7 M
v = '"' + v + '"'; 5 _9 P5 S d, ?1 o. d+ Q
} else if (t == "object" && v !== null) {2 i. n. p& }7 p! M: ^
v = self(v);& O: H7 c! l" S/ |" s: Z. T3 m6 N
}: }8 f: L: E# [# S5 _
json.push((arr ? "" : '"' + n + '":') + String(v));+ o4 x5 _% |0 M4 s
}+ a9 N9 K2 B$ {% d
}1 O; C6 b3 d9 `
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
8 Q- v. Y+ J( E" E4 m" [ }
1 n. g- W( C! l2 C3 ^};$ V+ \0 U" j* O) l& q6 m
6 ^: L0 J1 K2 x4 v/ `+ q2 @& D' O |
zan
|