- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
1 f: x; L- \1 r算法:
" X% x4 W1 u7 E; p 英文是单字节字符,中文是双字节字符,! b5 t. O. ]. h5 k' \
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源) w+ j' i8 T& Z, z+ i
, S+ G- c: U; n+ I# b m- E% r/ `
假设n个字符里面,有 k个英文单字,i个中文双字
1 q) q( ^/ T+ ?# G& {6 z P 那么截取的时候只用考虑最右边的i个的字符6 z$ Y) x5 z/ m, J0 G
0 \9 ~; U# w1 w% B assume 左边都是英文单字的话,那右边的就全是中文;
9 b+ S" a o, N D* \2 |: q 如果全是中文,那么有几个中文 就截取几个字符
/ R2 y9 p7 ^& {3 |0 M" C, g1 z/ b9 m4 u5 H
迭代的函数 输入应该是字符串,输出应该是左起的n个字符- w# K. o: j4 L: d. W
迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现): m5 K( A1 O0 \, n
. ^) u1 B7 L$ y4 C' C& q5 E/ H
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
6 A. q/ p- M8 V4 _-------------------------------------------------------------------------------------------------------& W, \7 p( q) F" _6 t
if(!String.prototype.leftB){ # |3 x5 J) |& U0 h! a6 X
String.prototype.leftB = function(n){ //n=7
3 w$ b1 d7 P, F" ^2 _! Svar s = this, //s="ilove我自己"" j. ~( L. ?# B% M
s2 = s.slice(0, n), //s2="ilove我自"
8 L4 D- O/ @# H' X3 S+ o) W5 n% zi = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
; ^ l0 L9 e7 Q/ [if (i <= n) { 1 m! g" P o2 b6 g# @5 W
return s2; k
( U G. t7 P# @, W6 q+ S! j} `# _ n" Z5 D, D0 q
i -= s2.length;// i=9-7=2 , n =7,几个中文4 y* N- t4 Y" r6 Z/ o9 Z
switch (i) {
s9 R# W1 |7 H& bcase 0: return s2; //全是单字节
: s: j4 Y6 _) [% Scase n: return s.slice(0, n >> 1); //全是双字节,比如中文
4 l* q1 T4 W% y3 h: t. Zdefault: 9 s- W1 ?6 |! x+ ?9 F4 T3 I) {
var k = n - i, //k=7-2=5,几个英文字
4 |* E* U- C6 k* m8 @1 z5 {( }, Ws3 = s.slice(k, n), //s.slice(5, 7) s3=我自"4 \! r$ e# L, i9 M) W- N5 Z
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
b9 }+ B2 x* K1 G; u( d! D9 `/ }: z- }return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
' ~$ G. Z N1 g! r ? d: R} . O5 ^2 j3 v+ k2 @( @% R
}
; g9 a6 h. i: K: B) u6 B2 g# Z}
' \: p; ^/ J' Z+ W6 e+ Q7 X* Q-----------------------------------------------------------------------------------------------------------------/ r6 o/ F* u% N. S
var stringify = function (obj) {. X0 o, G1 h$ K: G. ?
var t = typeof (obj);
, ?- Z4 z6 U# J, E+ t2 ?6 \8 R- B if (t != "object" || obj === null) {. c. t3 \# Z- O5 P, Q, _8 @) J$ |: v
// simple data type
" ?8 q: B* r% F( | if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
0 h8 V9 g% m/ m% E" ` return String(obj);
, `+ D5 D! Q3 r! V7 ?" Q } else {
4 _4 U, u: t+ z // recurse array or object
8 n$ {9 M1 k1 X4 K o7 h var n, v, json = [], arr = (obj && obj.constructor == Array); k' z& L/ _$ w3 B7 \; u. v
& r- L( D! s) W% `. o // fix.( O& p6 Y1 F: t* Y$ s' H
var self = stringify;
. F r( g# @5 l' O) B! ] {, `. V; m; i( \7 W
for (n in obj) {9 c8 Z$ @& [/ |% U5 F- k0 r3 d
v = obj[n];
! D- h+ }5 N# Z* A: O; F t = typeof(v);' n0 _6 P8 ~" }1 y& p% I+ M
if (obj.hasOwnProperty(n)) {7 E# j! `. f9 P. r3 H
if (t == "string") {
. j9 m) v& H" r- O v = '"' + v + '"';
5 w4 X' B! G' H, ^ F; @, S4 Y } else if (t == "object" && v !== null) {
% c5 _* R8 s+ T, W9 ` v = self(v);
: z4 S5 T4 p+ X9 v3 } }
2 x2 `: Y" Z& v" h' V! i json.push((arr ? "" : '"' + n + '":') + String(v));! f& y5 C/ R( W9 t4 a) H
}
% z7 N% b; u2 m# Q) X8 l4 { }
' `' X, ~9 ^5 P$ K# W0 d7 ? return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
& @) D0 {3 \: S6 [+ F# c }
g \2 B' A- B. X0 H7 Q$ e8 F+ n};, P9 g% q4 _) F$ @4 e
+ s s: P! [; X3 |3 s: }7 v
|
zan
|