- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况); Q5 W) J& t3 k4 ^- j6 W
算法:0 M4 @, K/ n$ k$ J' k! q
英文是单字节字符,中文是双字节字符,
0 K( E. R5 J) m) _ 如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源/ Y0 A% W- u8 T# \; b# w0 Q' t5 ~
( w3 o4 v0 g) K f( e+ ?" _8 _
假设n个字符里面,有 k个英文单字,i个中文双字
3 T( W1 k7 C6 \) r b4 I+ @ R6 n 那么截取的时候只用考虑最右边的i个的字符0 u& G, Y9 u* A
4 Q, p/ p+ m E u" Q% |
assume 左边都是英文单字的话,那右边的就全是中文;- S* a' g0 e- {- d3 R. h
如果全是中文,那么有几个中文 就截取几个字符7 ^% g, c4 t; y
$ g0 C# r; t& \* @7 e* C; q- ?* Y
迭代的函数 输入应该是字符串,输出应该是左起的n个字符
5 A3 U- _7 m+ T5 d5 U3 Y' a迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)& F6 P/ O' u4 a7 b5 I* t. G p
3 w/ Y" w# R& p( x U5 x: h
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
+ ^8 ^- M0 f9 `$ K6 A* f2 R-------------------------------------------------------------------------------------------------------0 D7 V7 f. _, v9 E
if(!String.prototype.leftB){
# @. _. I1 [8 U: b: O3 nString.prototype.leftB = function(n){ //n=7
6 h( [4 |5 S+ y/ Ovar s = this, //s="ilove我自己"& {% u6 E& w$ Z2 S% {
s2 = s.slice(0, n), //s2="ilove我自"
1 f" m9 {% Z+ f( _0 ci = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
. c6 H2 V) }5 v6 Cif (i <= n) {
. J* x& w5 l: [) greturn s2; k2 R% N. A4 H/ }1 p% l4 J5 l' Y) ^+ t+ ?6 S
}
4 w1 G3 k* V2 Vi -= s2.length;// i=9-7=2 , n =7,几个中文
" U( l4 I# G$ x- s; p6 Q; V# eswitch (i) {
- i- e8 e: e/ ^case 0: return s2; //全是单字节
5 }- |# h4 q5 W9 U- U7 tcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
& {7 N6 i \: C( C `+ h2 C- rdefault:
0 @, I S6 C. t+ Z0 pvar k = n - i, //k=7-2=5,几个英文字* }; F `( F+ W# d2 ?
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自" P' n* f: _* E# P0 Z
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数! |1 g: q2 ?9 C0 P0 O4 G
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!- H2 Z7 i$ I2 x& p
} ' D# W# a# P: h
} ) S2 l+ O* h! Y1 V2 y; e; D
}$ Y8 p8 ^# y4 _7 i
-----------------------------------------------------------------------------------------------------------------
! ~" K# w( [! H* s1 E4 y x+ uvar stringify = function (obj) {: m1 H' s" O1 L }9 q, e2 \6 Q
var t = typeof (obj);# _5 S4 ~0 ]3 w/ p5 _" } B
if (t != "object" || obj === null) {
9 Z6 d+ m/ ], O/ |, X& n" ^ // simple data type" g7 S+ v: f( U* z7 w
if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!6 E# `; ]. _1 }- w7 @# `+ S
return String(obj);! l7 @2 U6 A- m
} else {4 J: f7 t7 u5 P7 D, y5 ~- Q. k7 t
// recurse array or object9 W8 X2 d9 O H: y
var n, v, json = [], arr = (obj && obj.constructor == Array);1 @3 P6 N3 v0 D# j# L$ p+ T
# Q+ u: @- X! |7 y // fix.
! u* K; ]7 k6 _/ k+ i var self = stringify;
9 U& x/ [: w9 q; [% B3 {) U3 s: C; n% L. N, j! m) m
for (n in obj) {" t' o% ?3 y9 P9 `
v = obj[n];. r* Z j7 c D9 t+ K; H
t = typeof(v);2 p5 t5 n6 O/ P* N9 i
if (obj.hasOwnProperty(n)) {
* B- C- E3 P' O' x if (t == "string") {5 z8 d* o4 c1 ^) B+ ?3 b
v = '"' + v + '"';
+ k+ u2 S2 H0 g( G4 B } else if (t == "object" && v !== null) {
- g* h) x! i, N0 M+ m! i v = self(v);3 @ f8 G) `$ i# ? N9 M
}5 V2 u) ~ y( |6 s2 W
json.push((arr ? "" : '"' + n + '":') + String(v));; }% `! C, F {" a4 R- Q4 @
}/ e8 b0 S3 e" c {
}' }: ?3 ?4 ]6 l# Q: ~
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
3 @; G3 V& ^/ M: u/ b2 w9 E. I }% r8 D) h: e9 J. X4 }' E' O" U
};8 o/ `7 K! ~$ Q* c( O* Y
- [# C: \$ i1 M4 i |
zan
|