- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
- J- d: y2 |- U* k& f( W算法:
9 H/ V0 Z5 |( R7 c+ R* F 英文是单字节字符,中文是双字节字符,, a" I) S; @9 z
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
2 D& f1 r+ o2 k8 h; g1 |: U- X: |' F$ _8 ~% ?) R7 L/ ~
假设n个字符里面,有 k个英文单字,i个中文双字
) A( e! L+ E! V" p: d( | 那么截取的时候只用考虑最右边的i个的字符1 p5 I8 o" S" t3 W
- k( F3 F& [) _* v+ R8 L' J
assume 左边都是英文单字的话,那右边的就全是中文;
9 K0 {6 O( ~, y L0 N1 n1 [: m 如果全是中文,那么有几个中文 就截取几个字符5 p# Y, d" s5 L4 Y& d* Z
/ S0 r d7 N; j% s" S# s! x迭代的函数 输入应该是字符串,输出应该是左起的n个字符+ b( H' U. ?$ J6 v# U0 V* {
迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
2 G4 {+ U3 T) l9 J7 O
, [& C$ y8 N- T+ E8 P迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
- V s! u' h9 @/ r- k-------------------------------------------------------------------------------------------------------
& e3 k5 n' K+ u' l' o, J" Hif(!String.prototype.leftB){ % q3 C( p$ N% \' e3 V; F- m
String.prototype.leftB = function(n){ //n=76 i" U* X- m6 B- a# n( i$ H
var s = this, //s="ilove我自己"
5 ?" k2 s/ Y( p* m; e% P( c, es2 = s.slice(0, n), //s2="ilove我自"
9 s6 F5 T4 N* f" V/ R4 di = s2.replace(/[^\x00-\xff]/g, "**").length; //i=97 y: o! O# N. P) J5 ^
if (i <= n) { : ?7 w+ {- v. D7 P1 _4 ^3 ^
return s2; k# Y0 ^# m, O$ i( L
} 4 D& X- \& [( U" m
i -= s2.length;// i=9-7=2 , n =7,几个中文3 k4 c; S1 Q7 p9 R* ^5 L$ M
switch (i) {
4 {1 s, Z- Y; x2 U6 g; scase 0: return s2; //全是单字节0 |6 [" w8 }3 l' L; A: ^
case n: return s.slice(0, n >> 1); //全是双字节,比如中文
c1 a+ d* V: y& @* j4 _/ Mdefault: 7 H& e& P' {& d: k* v3 L
var k = n - i, //k=7-2=5,几个英文字
^9 @# @7 r! A7 e( P& y: h7 es3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
3 m; d& d- e& Rj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数* m) }* |4 o% @ G
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!- } q/ f( \; M9 W- Z1 T
} , E+ Y, _8 s# T2 {# H. N$ B- F
}
2 j; x* l. k( o: Z$ s}
U$ u* b$ |2 H$ R- J: J-----------------------------------------------------------------------------------------------------------------
. ?- W2 q! w+ @, \: Kvar stringify = function (obj) {
! O' z8 f' M! b( j var t = typeof (obj);2 k" w/ X. Q- D5 m; v
if (t != "object" || obj === null) {$ r! E6 [+ x4 Z: E
// simple data type, ?+ [! `8 `# V2 q5 [) L }
if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!7 [* j; b+ ]. h) G) W
return String(obj);
2 c! D, b) B& ~: v1 ~ } else {
/ T, E1 \% y, x9 P+ y5 s# B4 y // recurse array or object$ n6 R/ M5 x F1 h( {& f0 \$ @) u
var n, v, json = [], arr = (obj && obj.constructor == Array);
. K+ ^( f& b. V# R7 G% T; q$ i" K& t8 E# y& w0 ?8 s% ^% `6 y
// fix.
3 i2 w# C7 q+ ~! l var self = stringify;
3 a8 b6 s4 ]9 f; {; Z1 w6 O& l. Y7 m, d* s7 \) R0 T* n e) {
for (n in obj) {
0 V7 l0 B# w! y( ^) V v = obj[n];
$ P) o/ k6 ~4 v* J9 e2 D- y t = typeof(v);' D) v, G8 |& R9 r
if (obj.hasOwnProperty(n)) {' b0 W1 z+ X _2 f8 x% Q# G
if (t == "string") {
( p% ]4 e. E* f' t, N1 X4 I2 g v = '"' + v + '"';
4 I& m7 |& ?" k" d } else if (t == "object" && v !== null) {$ S/ o, D; T; n$ {% I
v = self(v);
+ r' V! ~ o) T4 L3 _9 X! [ }3 o: K6 A! ?' `- M" [
json.push((arr ? "" : '"' + n + '":') + String(v));# T1 ]1 U N/ N4 J/ F; ?* e
}
, G# G9 t7 g9 Z* @0 b2 j }9 ]% h2 k, L* [" B4 ?$ {
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
3 T' h8 [3 C. E' ?' r1 e0 c }
, y% D, j, O# ]4 s};
% Z$ z: V g* h" a+ y9 _% d
0 e* g& g( r* w- z8 @ |
zan
|