- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
% |, G5 t3 w# Y8 Z$ s, E算法:0 t; S2 b% `3 t' w
英文是单字节字符,中文是双字节字符,4 V" r& s( {$ ]# v9 n: w F, s
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源7 I; P, u P4 s) o# b; X- I
% _' k# H! d: }5 X* T3 ~6 g 假设n个字符里面,有 k个英文单字,i个中文双字; o. I+ z" `' N1 T& ?# u# i4 F0 P
那么截取的时候只用考虑最右边的i个的字符4 n- y+ P6 @) ~* J
1 O3 N8 L8 x( a @& ? assume 左边都是英文单字的话,那右边的就全是中文;1 [7 J+ u7 ^$ ?2 w( {4 \2 q0 c
如果全是中文,那么有几个中文 就截取几个字符" _" D) m# [0 B* E, A! X. o
0 s; H) v+ m& {3 b# `- D迭代的函数 输入应该是字符串,输出应该是左起的n个字符* r7 E0 `0 `! ?) k2 a
迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)$ K* l8 N3 [- v( g. N) C% Z. m- M3 t
& X8 j# I2 P s8 s2 P5 j$ [
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代' Q+ m, v1 y# j
-------------------------------------------------------------------------------------------------------
# F# e, d( P2 n/ V$ Y" Rif(!String.prototype.leftB){
1 R ~. P1 `% A' R) d0 }String.prototype.leftB = function(n){ //n=7
( V6 z& J# Y" s* Z Qvar s = this, //s="ilove我自己"
2 u8 O& k1 V6 ls2 = s.slice(0, n), //s2="ilove我自", g- K/ i- O, e2 L
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
: z/ M% e, u9 p: O6 y' k4 {7 o4 u# Mif (i <= n) { ! z( O; M( k2 z+ {
return s2; k
$ \9 O' b" u; c! N3 N& j$ t} 2 J7 B N/ c( x. t9 @/ L. ]8 p
i -= s2.length;// i=9-7=2 , n =7,几个中文# W& {' n- B1 c5 O3 M0 }
switch (i) { + V0 X. U) ]- X9 S% o
case 0: return s2; //全是单字节9 \1 H2 j3 V$ U! s# S8 w F
case n: return s.slice(0, n >> 1); //全是双字节,比如中文. C. @, ?4 }' X+ o4 O# F+ i* C
default: : a# A8 ~7 p7 d! Y
var k = n - i, //k=7-2=5,几个英文字6 }3 O# W8 T* ~$ f: _0 W) h f
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"2 A. z% L1 M, |" ~
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数, @" x% G4 L2 g* r" D
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!- l# R9 m8 f6 Q" I
} 0 v! k3 p* E& p3 m- L4 g
} : X/ b7 D- ` h/ [* w' R
}: h1 [1 w8 G7 [7 \2 l B
-----------------------------------------------------------------------------------------------------------------
) P! k6 X( b# I% S' lvar stringify = function (obj) {
+ V- X1 T7 D$ ? var t = typeof (obj);
& T0 `( Q6 y6 ^3 f if (t != "object" || obj === null) {
# o3 L8 J; m! S* u; o // simple data type
- K$ x D9 N+ @# ]6 V if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!+ @ q0 x( ^1 c; t9 W) Z
return String(obj);
5 ?( U1 U9 E" o* K+ D } else {
2 f- H5 ~5 S# D r // recurse array or object
: P/ j2 p5 P# r% k! t) G var n, v, json = [], arr = (obj && obj.constructor == Array);
7 E# M* _( Q$ V) v& r1 X3 o: f6 v' \2 F* ^+ Y1 Z! N* x
// fix.) N4 D' o2 P3 ]( k- X4 r$ K
var self = stringify;
' ~ I* |' i& ?: v! D" e
6 X2 [# D$ ^' @ Z( F for (n in obj) {' T6 W6 b+ w. T/ I# A8 }5 |
v = obj[n];% y# n+ w9 E; a! H
t = typeof(v);8 P( h8 e( h* u! U
if (obj.hasOwnProperty(n)) {
4 b; C8 `, z9 ~3 |& l if (t == "string") {
" t- N% I& H) U4 C v = '"' + v + '"'; ! c6 F0 C& V2 k
} else if (t == "object" && v !== null) {) ^9 K/ B* e. f( W
v = self(v);
) X- V# F9 v8 O* x/ k7 | }4 \" T4 ]# t4 d& A
json.push((arr ? "" : '"' + n + '":') + String(v));
% B0 a' B* n/ S }
- E+ u( G, L5 S Q7 @ }" {4 s3 v" f, E5 M. v4 j% c
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");0 x4 r# G3 O0 }+ h+ V! [, ?% m
} p4 j7 N" C% e
};% j. x! Q ?% H* w& z% ~/ a- K4 Q
$ r. x1 A9 R D+ V/ ~: |; y' [8 s
|
zan
|