- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)# w% `0 W. z+ F& W( a4 c
算法:
2 s0 d) Y- v% ? 英文是单字节字符,中文是双字节字符,
* }0 p5 }9 \ H* c' F1 c 如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源, V% o* H" y) s5 t0 A2 X
7 u* K6 I* {. M1 O
假设n个字符里面,有 k个英文单字,i个中文双字! y4 z- L! t: O/ S9 d' D
那么截取的时候只用考虑最右边的i个的字符- m% K* o5 ~* F/ w# b5 i, D
1 d# u* A$ I) [! Z1 z$ c5 E0 N$ W assume 左边都是英文单字的话,那右边的就全是中文;1 R: s! t5 R6 {3 m
如果全是中文,那么有几个中文 就截取几个字符
# P" S, W' k5 [$ V8 `7 ] y& ~7 a
! N7 H) Y% m% E2 y* g `1 \迭代的函数 输入应该是字符串,输出应该是左起的n个字符
( Z% |5 w& Q7 z! y& N8 | u迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)6 a4 e: _, |9 |6 z
, Q5 \/ a! A# }, W0 y0 R
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
* L" l$ |1 g: j-------------------------------------------------------------------------------------------------------
' h6 J" I! y6 qif(!String.prototype.leftB){ + }, j# D- e" t2 D2 c9 h
String.prototype.leftB = function(n){ //n=7
' E: n6 u* E7 Q' `( W& nvar s = this, //s="ilove我自己"
| N( ?. a8 }' G% ps2 = s.slice(0, n), //s2="ilove我自"
' n) p4 e* V( Y5 w, Fi = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
' k9 X' t. ?% Jif (i <= n) {
* T4 c6 e$ S0 g8 h T! ?return s2; k
% u" ^& O1 l( B/ o3 E3 x} / u9 Q# W( v- q- i: D# z5 E+ M
i -= s2.length;// i=9-7=2 , n =7,几个中文
( c' C0 u# p" E4 ?switch (i) { 0 b% H7 E0 X5 ]) v
case 0: return s2; //全是单字节
* y. h* N8 c0 |5 Qcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
+ d0 O/ X/ _3 m5 J: sdefault:
0 h* F" X, m9 s7 |2 Z# gvar k = n - i, //k=7-2=5,几个英文字
- H, J' t; a' W5 S) z8 W. T& Q+ Ns3 = s.slice(k, n), //s.slice(5, 7) s3=我自"$ u" ^/ p1 @- ^
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
7 }/ U- `7 m) G. dreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!7 {5 m3 f$ x6 O4 G0 L, q; W
}
4 ^$ x3 P* L0 l& ~5 V} + V/ x0 a- Y1 e3 v* X' f8 u
}
: S X/ q' s- H; ]4 [-----------------------------------------------------------------------------------------------------------------
m1 f5 G; ~ e3 l6 P7 X `0 Y! a# Wvar stringify = function (obj) {
0 h6 u: @7 K4 v% |& R var t = typeof (obj);, [7 _2 f' F3 V' C' X
if (t != "object" || obj === null) {
Y3 a6 M* i1 U4 E& d; h // simple data type! a0 a% D& `+ C( Y9 j5 ]1 ]
if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
( P; }3 [6 f4 H }$ a% u# F- P return String(obj);
' `3 ]6 R7 G! i% D; B/ f } else {
& @1 o% A# S7 Z# l- `1 e- o) [ // recurse array or object
, g) U4 X9 o5 Q% b% | var n, v, json = [], arr = (obj && obj.constructor == Array);
. U( H. C1 P9 G; C
2 C/ t K T% x' M9 ]% U // fix.
6 g* ]& t$ {& {# \ var self = stringify;; ]2 _0 {! _& T& i d9 S8 o
- [9 [1 \7 ?: K* @ for (n in obj) {4 A& F% s8 J; K5 Y; U
v = obj[n];
, V& M. z. A. N6 d! Z7 W6 x0 c t = typeof(v);
' E3 j3 ]: s- } if (obj.hasOwnProperty(n)) {* k5 ^3 `: i% A3 L. |
if (t == "string") {8 w& C0 \% m& j1 G5 y/ Q
v = '"' + v + '"';
+ g# \) Y% R4 } } else if (t == "object" && v !== null) {, E+ k7 `$ E& _) D% J: t
v = self(v);0 x% P: N( F8 J1 \+ Z2 W
}4 w. U' B2 l% d$ Q1 J
json.push((arr ? "" : '"' + n + '":') + String(v));6 b0 U1 g& K4 P) n2 D0 k) G
}
1 q7 K0 n, ?6 u/ L6 h- w1 t- p }" ^- G" n* _! c/ `0 O' t( ~* z
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");! |, J4 i1 [4 M A! h- C, z6 E# |
}
7 p, }1 y0 |7 {/ z K3 }};
/ u& s* C4 l6 ?% ]* k
7 y+ m8 A/ w8 Q; P3 q ] |
zan
|