- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)+ t4 b4 [5 } ~. p) z
算法:; K( r& |1 k9 q% h% z6 `, A9 @
英文是单字节字符,中文是双字节字符,
; B# |) U0 N( X4 x, z8 E# i3 t9 _- H/ z 如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
/ ^3 o8 T/ \' e T
+ z* ?4 r8 o* e; X! ]4 w( A G 假设n个字符里面,有 k个英文单字,i个中文双字) j& ~9 o7 c9 Y
那么截取的时候只用考虑最右边的i个的字符0 Q3 N+ _: t) L- Q: g& n
4 k! L- M/ O4 [# ]1 I* H assume 左边都是英文单字的话,那右边的就全是中文;* G, j% j+ y! _) c" Z
如果全是中文,那么有几个中文 就截取几个字符
, h+ @/ q# l. R* \5 W/ G; E9 X& l1 F
迭代的函数 输入应该是字符串,输出应该是左起的n个字符
! ~; u" i. _5 I$ C( C, o/ L迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)0 f4 I* Z4 Q/ K2 Y; h7 B6 M
+ \2 {& u0 b- q# G9 p+ p迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代3 S2 q+ q/ f; U9 S% r5 k, N. |# ^
-------------------------------------------------------------------------------------------------------
# F! P5 H8 ] ?, Y- bif(!String.prototype.leftB){
6 m; b+ U* D, d+ j1 {String.prototype.leftB = function(n){ //n=7
+ z3 s7 X% y6 Bvar s = this, //s="ilove我自己"
2 t5 t9 c. I0 f6 B n$ M* k7 k1 xs2 = s.slice(0, n), //s2="ilove我自"2 ^! o& h/ |% A+ I D! I5 c
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9: V3 A. d5 A" c* T
if (i <= n) { 8 e0 W. e1 z( p- Z2 Y! B
return s2; k- h! Y [7 ~! Z9 g! v
} F4 ~, e8 J, ~8 C/ Z, `9 r, z, L
i -= s2.length;// i=9-7=2 , n =7,几个中文
) ?" B& J+ Q0 \6 E# ?switch (i) { % @7 ]& {; d9 J2 t! J* k) D
case 0: return s2; //全是单字节- C2 }3 C* d, b6 E/ E1 C( @
case n: return s.slice(0, n >> 1); //全是双字节,比如中文% w1 M8 M; f, Q# l& j+ Q9 g$ k
default: 5 {, f0 u0 Z6 T: D5 L6 g3 m
var k = n - i, //k=7-2=5,几个英文字
" U+ J0 R! e4 M% vs3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
* R( y1 g2 c; n9 a$ P7 B& Oj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
5 m$ H; R l/ i x6 ]7 Sreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
5 N7 }! o _/ ^} # _* }4 s" w- a3 U
} 6 i& D( C- M' v% }
}
) V, ~4 L. e8 @; c X" f1 h: Q-----------------------------------------------------------------------------------------------------------------* o( K* N: S+ o, {" Z. |( B6 k
var stringify = function (obj) {
- s9 c4 M2 Y- n8 R) M0 A( m9 @- e var t = typeof (obj);/ R6 @* @4 a, Q- o6 z* R w4 g
if (t != "object" || obj === null) {
5 F$ }. Y6 k! R }6 s // simple data type
- a9 [0 L3 ^& z' { if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
2 f/ G; L8 [% F: O0 E- d return String(obj);
: O. z j+ k. X3 c# L1 } } else {6 M9 y8 R& { k3 B
// recurse array or object# ?/ m* |/ h$ F+ {! d
var n, v, json = [], arr = (obj && obj.constructor == Array);
# J J, F4 y2 v7 }# }* S; k6 b& n% j: i3 ?, s- X0 m9 K# ~
// fix.* a$ Z& a9 j: Z
var self = stringify;. v- E' t- j" O& l' R8 j6 k
# t6 B: W- D5 ~* _ for (n in obj) {
. O5 E! J; ^& y- C i! L2 L7 \8 C8 ` v = obj[n];
* s' u. L* T- o8 B t = typeof(v);
8 I. f. h7 K% m$ f0 n if (obj.hasOwnProperty(n)) {
. J( k% ]6 W& E Y if (t == "string") {( ]6 r) y, u7 f/ @4 r
v = '"' + v + '"';
k6 k+ E4 o3 G6 }/ m o0 m } else if (t == "object" && v !== null) {6 L" l1 D4 c# |7 b
v = self(v);
' g- E* `. N; I2 F& A2 W% M: s }3 Q) _. K9 n; [2 p& r
json.push((arr ? "" : '"' + n + '":') + String(v));
% q* ?5 w' l& z$ N( { }
( f# l! X- d3 _$ f( A }
; Q5 ^! I5 ` y. Q return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");! j7 X) E9 S* K: O6 V/ B
}
7 v1 K; x6 D- y' _# n};# z0 P* E& s3 S; X3 w5 W: t2 n. w
8 ~. j) i% b- x, q% Q2 l8 Y4 |/ N
|
zan
|