- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)3 E7 B* E& U* l) C3 O" b* l7 R& Q
算法:+ e- L$ F9 n9 p8 l% N: I% s4 E
英文是单字节字符,中文是双字节字符,& B: i- r- [! P7 n2 d; s
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源) q' D% B+ Y0 S+ d# D% W
: B, `% D6 [ @( h
假设n个字符里面,有 k个英文单字,i个中文双字+ i+ C3 y$ x1 c* Z
那么截取的时候只用考虑最右边的i个的字符
) e; K# f' ?) ~1 u4 H* c ?* c7 D$ }' `
assume 左边都是英文单字的话,那右边的就全是中文;" m% D: l7 p% l d+ f$ [- D9 a
如果全是中文,那么有几个中文 就截取几个字符! H2 e7 }. O- z! Z
. H- P4 J; m I: d1 a3 s迭代的函数 输入应该是字符串,输出应该是左起的n个字符, u9 |* J, t# H% g
迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
: T# @. @; M5 ?& V7 D+ d
: V( G- X5 q' w2 N迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
2 C4 [( A/ \. H( m( W9 B-------------------------------------------------------------------------------------------------------2 }1 Q9 l3 E( \) R
if(!String.prototype.leftB){
. z5 G1 U f& O: F) A3 oString.prototype.leftB = function(n){ //n=7
) {6 |0 t% `: p0 ?7 s8 q; kvar s = this, //s="ilove我自己"! q T- `4 k" D( S$ M! ]6 h: j% b
s2 = s.slice(0, n), //s2="ilove我自"* @# _1 T8 k, j. M Z6 H
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
: h- v ~9 q. cif (i <= n) { 3 {) ]+ p6 v H- W! M
return s2; k0 @5 ~; H( b- K* W* g% c: s
}
' w. B( g- ^9 b1 ki -= s2.length;// i=9-7=2 , n =7,几个中文
6 b% t% F( l& b3 c: f6 hswitch (i) { ) D' U- a! f1 V. K% w, Y
case 0: return s2; //全是单字节- R m# O7 }# u
case n: return s.slice(0, n >> 1); //全是双字节,比如中文1 y" o- [5 O2 Y/ V
default:
% Y E; u# Q3 n/ Bvar k = n - i, //k=7-2=5,几个英文字
' ]9 T& ?" i3 {. \) [, Fs3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
! s7 g4 e" c2 ej = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
7 e+ C0 E1 C; ?; ^$ @6 p g4 Ureturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
$ i: Y H: V- k0 a} + @$ q+ w7 ~! f* H
} V0 s" V' J, A* J* e
}
. d, K2 l5 R& N p- P% |-----------------------------------------------------------------------------------------------------------------) m/ y; Y3 E! @2 V$ A. O6 z
var stringify = function (obj) {3 T( B9 ]6 Z7 F! z! W( K
var t = typeof (obj);# H5 j$ s6 q0 Z x
if (t != "object" || obj === null) {3 l7 K+ W b' [8 s$ h( ]2 B
// simple data type
+ u, x9 `+ A! S$ x0 H, \/ J2 e if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
: g' @. X+ r0 k3 w2 z( W5 O return String(obj);9 Y, h& o6 N; I! X1 t# F7 c
} else {5 j" Q4 D+ ?, j. N
// recurse array or object, M# h' o) o( Q8 l9 B
var n, v, json = [], arr = (obj && obj.constructor == Array);: Y3 F* K/ Y. d& E& q5 L/ n/ z8 Z( x
- P& k$ D. J3 [9 L7 g1 C
// fix.) ^5 z9 `- ^1 D; ]4 h% o
var self = stringify;* |+ u4 U. j( ^5 l7 t
W* t- J+ {6 N* p& c- M: j
for (n in obj) {) D [, R0 ]* }" S- X' ^, _
v = obj[n];
* }3 I' j& F$ s! q% L4 b t = typeof(v);- N; U- t" z% ?' L
if (obj.hasOwnProperty(n)) {
3 W( W% M2 A2 ]0 W6 A$ {- w- c if (t == "string") {3 |8 _$ b' @! V# ~
v = '"' + v + '"'; & X( O7 m: x+ r5 t% E
} else if (t == "object" && v !== null) {/ ?9 s5 D; A& q, y# ?* k; D+ Y
v = self(v);
w% M: o) G) B3 C% U. S }$ g3 Z) b$ V9 `4 V0 \- x# e
json.push((arr ? "" : '"' + n + '":') + String(v));! I3 p" P3 ~8 O- v
}0 u) e$ a4 m" ~; [, m
}0 J2 C5 I+ g5 R+ {, o3 b
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
0 S2 S0 h- N$ m. M2 M2 r I$ F( w }
, ]/ |8 ~5 K$ e( F x- M};) R" p5 h0 A+ {& A
9 o( W. S) d6 W, a
|
zan
|