- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)+ s' R0 h: V5 K! E' n( t2 y2 S S
算法:
+ g" V. }. k3 z0 y# P 英文是单字节字符,中文是双字节字符," ]! ?! z# x- `$ k8 ?' q# b
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源! k: h* U( W7 r( U- D ]# x
5 \# y3 o; S; O) H* @4 ~" y, |$ O
假设n个字符里面,有 k个英文单字,i个中文双字0 s# i; R% u" K; {" [& b
那么截取的时候只用考虑最右边的i个的字符
2 K8 a) x$ M: {) J t# I! q$ T, v7 `( H% d" B9 j7 C9 }; U$ e
assume 左边都是英文单字的话,那右边的就全是中文;- H3 |5 J" h' u
如果全是中文,那么有几个中文 就截取几个字符
% m8 Y3 U* V2 P1 P h# ~& ^! T
, {" ?$ K, I' [% |( q迭代的函数 输入应该是字符串,输出应该是左起的n个字符) R9 G! ~! d1 V+ i$ k' x; q9 ~; l
迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
0 x) z9 m4 s: }" @# |+ `. ]! Q- b# ?6 i
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
- O) Q- e/ ]2 n8 l; x& b5 ?% T-------------------------------------------------------------------------------------------------------
# v. ~* O7 |& Q8 S7 |if(!String.prototype.leftB){
7 e" c' R# M" H5 \" f# S/ _String.prototype.leftB = function(n){ //n=7- W& E! [# e2 G& z" z- x
var s = this, //s="ilove我自己"/ D7 P; p$ i* w5 d8 {, g0 L3 D! B) W
s2 = s.slice(0, n), //s2="ilove我自") k6 X9 |9 Z5 a9 U- Q3 T1 d
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
0 w7 j, K3 \- T) dif (i <= n) {
/ w1 B5 _) D3 G7 l/ }) Y$ h9 \ hreturn s2; k
. x( ~* K) ]% Q# g, H- f} 1 g# x9 T; o3 B8 L0 U" ]
i -= s2.length;// i=9-7=2 , n =7,几个中文
& M h1 ^1 N9 @$ |: t) M) |/ Nswitch (i) { 5 U3 a# U( w0 H6 e( Q
case 0: return s2; //全是单字节
9 }7 G0 c5 H K8 ]" ?/ D0 Gcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
" n) x2 Y" V# p _* [0 L$ Ndefault: 6 M9 Q6 W% ]; C6 N7 h+ s3 [
var k = n - i, //k=7-2=5,几个英文字
, T) \7 W! }5 b" o1 \! ps3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
& C& W5 K% S- L r. v wj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数, b2 E+ m9 K" i) I S6 v: |# F
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
0 q5 I, ~8 N2 D; t, ^9 L}
, B h6 a3 Y/ H6 h" L9 V; K} ( P0 _) U q$ v, P
}/ G" i- `. E8 m$ B% q
-----------------------------------------------------------------------------------------------------------------# I( c4 K5 S" w* }! H
var stringify = function (obj) {
- R! c2 d- S6 j/ R: w6 }( W var t = typeof (obj);$ Y m/ Z' S* t* @# @& [- _& A
if (t != "object" || obj === null) {: c$ U9 S- }* x( t
// simple data type
: v: `$ D3 U6 n2 v/ R% w if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!7 L. @' T7 g* @- A3 ~4 W
return String(obj);
. n/ o$ R+ q. h) M* [ } else {
* @- o6 u6 [& ]) O // recurse array or object
! C; g5 r; j F. r; o var n, v, json = [], arr = (obj && obj.constructor == Array);
: ^1 z* ]' i8 Y. |! b
) x4 W) i( O0 _ // fix.
# \- e* a6 j5 H, } var self = stringify;/ O* n! T/ @5 K; _* d M6 G
b' \: M3 u3 p6 q* `( _' w) ~
for (n in obj) {
' u3 Y6 V& x7 t/ _2 j: P. X2 F5 ?, } v = obj[n];
) ]# e @/ }7 o; K% c1 x( {* q6 R t = typeof(v);7 f3 j( Z. b/ |# `7 _0 `
if (obj.hasOwnProperty(n)) {
$ j, y9 S( G/ c* a7 q' u" c7 r2 X3 |& ] if (t == "string") {, e* x. o- j ^; L$ g
v = '"' + v + '"'; , ]0 ^; X# l' ?+ B+ N0 O4 U
} else if (t == "object" && v !== null) {% {8 @' ?) w& q) {
v = self(v);
1 n" ^+ z7 S5 D' W }
$ g" {! J) p7 _) i json.push((arr ? "" : '"' + n + '":') + String(v));9 ?4 B n1 \0 }1 P( W S* F
}0 W1 Q+ }0 Z9 [3 Z: B* Y
}
4 e" Y0 l: \0 `# q return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
( M0 w$ P" v9 C) y- I }
& I' v \! n7 @+ p. p) R0 v};2 q$ J0 x! v/ I; x5 f/ m. J4 a+ W
# u4 g" r# g" l4 c) D |
zan
|