- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
9 K6 m) X# P9 ?0 h q: g算法:$ j( [% u- ~% A- w1 [
英文是单字节字符,中文是双字节字符,! P" o6 ]. Q% ?" t
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源3 L: i" t$ v8 R- t5 h& \! ^
% b8 ~6 T+ ?+ |/ z/ U
假设n个字符里面,有 k个英文单字,i个中文双字
6 Q1 J! Z$ l S. S! W9 F+ f' y 那么截取的时候只用考虑最右边的i个的字符2 `/ \. Q: s5 `, F) \# r; L; p
- |& `( B( G- S/ H! B$ W) f assume 左边都是英文单字的话,那右边的就全是中文;
* A3 Q% o; j+ x- ]* t* p 如果全是中文,那么有几个中文 就截取几个字符
( F- g* H9 u) j6 Y" \; k# P+ a/ F: B+ O0 b! K9 q" J
迭代的函数 输入应该是字符串,输出应该是左起的n个字符* ^2 D2 N* S! K* L
迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)& t3 F; x% y! M
6 E7 v# p6 o' Y5 V2 u7 |/ ]迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
7 ]" ]* r# m( |-------------------------------------------------------------------------------------------------------
{5 m) A% Y5 ~% |# jif(!String.prototype.leftB){
9 x: r4 h" j7 v; d i7 FString.prototype.leftB = function(n){ //n=7
& C. |9 K2 i" b* mvar s = this, //s="ilove我自己"/ t% a7 {% z" t9 I2 [
s2 = s.slice(0, n), //s2="ilove我自"
3 a" z) W. H2 D7 }i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9, @, f% H( l+ p! x" S
if (i <= n) { : y' G! f. u0 B" g' ~
return s2; k
% @' S$ W9 J4 s4 `$ { {2 T}
: ^8 `% ?; D+ K2 ~- b/ F, }1 {i -= s2.length;// i=9-7=2 , n =7,几个中文
2 C/ {5 b: k$ v4 M5 Cswitch (i) { $ _( \' {7 d7 m) F( K
case 0: return s2; //全是单字节
2 M; I, F! l7 R0 r) I. f; ^' z/ vcase n: return s.slice(0, n >> 1); //全是双字节,比如中文8 i3 U+ P6 A+ h: y; c, l0 P
default:
v4 c( _. r5 W" Y, n4 m4 zvar k = n - i, //k=7-2=5,几个英文字2 g$ J' w6 L. x* g" _1 N
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"% G2 j/ ]- I& o, N3 x% ]( Z$ l
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
( H G; `' ~* G8 Y" oreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!: M8 i5 \' p2 r2 M; g% @8 X
}
& l) c& k' _% ?5 n} , D; o# l2 I5 Z' N/ \- {
}
* F8 P7 I8 k/ j; s8 J. H- w$ p-----------------------------------------------------------------------------------------------------------------2 i; m( U7 E( w8 d; Z5 A
var stringify = function (obj) {& V; g y1 ^7 s
var t = typeof (obj);
' X6 p* O3 t# A/ }% d6 y if (t != "object" || obj === null) {
: r7 M+ x7 b5 m+ S( f( P4 |2 a // simple data type; f! e: |2 @6 e- f6 N/ B0 q9 }
if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
, }1 S2 o0 V5 ?3 } @; U return String(obj);
) A( j) C7 L0 k9 u& z6 [; K5 c } else {
8 A) a4 P( j+ u4 y% X // recurse array or object
* \7 C! O# V$ Z2 \ var n, v, json = [], arr = (obj && obj.constructor == Array);
# S) ]0 m6 v; E% J8 ~4 s3 C$ j, V e% A9 ?: q
// fix.
0 S4 L$ @7 m$ j4 L' ~( n; w var self = stringify;
: p" c" x) l& e/ y' t. W, X
) c0 H7 ?' X/ |. B/ Z& l for (n in obj) { s S* @% U5 F+ s4 J5 `9 D4 {
v = obj[n];
. T U) M+ x6 z' J" |! d# i* O/ t t = typeof(v);
" p: W& U( `) h5 j( E4 W if (obj.hasOwnProperty(n)) {
! X- f8 J7 C% N+ Z" j" _7 k4 | if (t == "string") {0 `. d6 @" q* s4 C
v = '"' + v + '"'; . Z. Z3 Y0 [0 `! C6 i0 R
} else if (t == "object" && v !== null) {% z: h7 R6 P# X+ }) ], z
v = self(v);1 u* X# d8 I3 C6 ^" Q1 T
}: @. p+ v3 o8 Z
json.push((arr ? "" : '"' + n + '":') + String(v));
7 z8 `" [: r9 b- z# L' Q8 { }
+ d# D% d3 ]8 ]' g- J0 m }2 I* i8 G, `" c5 ]$ Z: @! K
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
# C( e2 ]/ k( [9 c! Y }
! q$ p0 N4 P: I};8 m& A, ?* w$ m" u
; X2 ^% t* Q0 J7 a c* q3 b+ x
|
zan
|