- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况); D9 e9 R# C6 O- U+ a/ M: r
算法:) A$ r( p9 ?) F; a
英文是单字节字符,中文是双字节字符,' G7 \8 T: b f, K) I9 M- W- ^6 W! \
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源" N2 j: a& x& X6 I
& H" K: A& F3 i3 W( |! d e
假设n个字符里面,有 k个英文单字,i个中文双字9 c3 S+ J7 e9 ]
那么截取的时候只用考虑最右边的i个的字符
3 W- C) ?* N8 x& D+ z% I, v5 V3 M$ S6 b% b
assume 左边都是英文单字的话,那右边的就全是中文;
. _2 r; r3 m" u 如果全是中文,那么有几个中文 就截取几个字符+ d/ V; t: d$ ]0 r
8 O; a& ~9 j5 B) {# w# M
迭代的函数 输入应该是字符串,输出应该是左起的n个字符
/ |" Z& H$ H, N! _迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
/ G/ h' H4 i: R/ \
0 R$ b5 m6 k5 l3 m( V P! j迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
* `* o6 x) O, }( ~ X-------------------------------------------------------------------------------------------------------/ s2 v) _9 [- e- g
if(!String.prototype.leftB){ ! T" L6 a2 j& _- c1 V/ X* V
String.prototype.leftB = function(n){ //n=7+ ]# m" u; S7 O0 f' W' R
var s = this, //s="ilove我自己"
! w6 M) B5 B8 Q- x# p0 @0 k% p! A j/ ]s2 = s.slice(0, n), //s2="ilove我自"0 J% ]) B" H% ]. o6 z8 y
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9 {' z: k0 X- P$ ?
if (i <= n) {
* P2 G3 w0 N3 Dreturn s2; k
( `, {. Z ?0 I4 A( d" J% z$ O} 0 @& r% H3 e& S; C! y' V7 \
i -= s2.length;// i=9-7=2 , n =7,几个中文
1 a. h' N1 v5 L( ^6 |2 p9 `switch (i) {
+ g4 f6 U! t- l" Ccase 0: return s2; //全是单字节
$ x" C; V. Z9 dcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
* x s3 X7 u9 J1 Odefault: - O5 L1 v5 I" P4 N) z
var k = n - i, //k=7-2=5,几个英文字. K! T- }( M, K" a, r# @
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"( G6 Q& s9 K3 j F' ^
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
! z; `% S" _( p, c# |) oreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
c4 B. ~5 B1 d# E, l} 9 o+ x: i; H; T( J- Y
} & b0 |* {3 W+ R$ f, P
}
+ _( F3 b) Y0 ~# c-----------------------------------------------------------------------------------------------------------------2 g, D) Q0 r) n' Q( }. g/ [- v
var stringify = function (obj) {' t7 O( s& Q+ z; _5 P% g& Y9 D
var t = typeof (obj);
; f: n% U6 Z2 r" z: [* l$ J if (t != "object" || obj === null) {
0 L3 h! k( z2 Y& O+ R // simple data type
6 r- Y$ T' x( f3 T3 h9 [ if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
6 f; I' N/ V& Z7 B return String(obj);
2 X( q b6 H" M7 m' x: O3 ^) t } else {
$ l' p8 F. f& a! U3 w' e // recurse array or object
& U1 b8 o% ~ r `5 b2 ~& W var n, v, json = [], arr = (obj && obj.constructor == Array);/ @5 T' G2 }8 }$ ?
% q7 t: S, [/ u1 a+ l9 j7 F: P // fix.
: Q2 `' n8 J7 I% [* W' }& l1 { var self = stringify;9 r& v* g: K# Z6 N
; P4 L- h8 }' j, V' O for (n in obj) {) T, ?0 C" Z* B1 |
v = obj[n];
; H% y+ v: c0 d* i1 F2 x t = typeof(v);
! V, {$ |0 y4 t/ F4 E5 P- D$ M) X if (obj.hasOwnProperty(n)) {; C" V3 o# y, P. _, V1 R) p7 ^$ [5 E
if (t == "string") {& b( F/ V% B- B" Y
v = '"' + v + '"'; [2 Y5 b, c2 Z" X7 _
} else if (t == "object" && v !== null) {% V8 _' f) R' Y$ U4 _& _
v = self(v);
* Q0 T8 U- K% c! X6 Y }
5 E B, ~; ]2 ` json.push((arr ? "" : '"' + n + '":') + String(v));! H, v. y6 l) b3 X p& c5 H* o* c
}* T/ y' ?7 E& ?6 w$ _4 w% u. R
}9 E) ]) u( z$ C
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
/ V4 A- T# W; M0 e( C- |1 T$ g }6 W# K$ K0 O6 q* M& N
};
3 g( L# G# G+ O* w. D- j! ?! y& G n3 t
|
zan
|