- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
. d! ~. w6 I. o% O1 A1 I& A算法:
6 a, `6 t8 v$ ^6 W0 k 英文是单字节字符,中文是双字节字符,7 p: S9 @: X! B
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源* X/ {( t1 T4 R2 ]! @* B0 V
$ X$ X, X5 z. E' @- r
假设n个字符里面,有 k个英文单字,i个中文双字
' v) |) C6 G4 J9 T# M N; R `# }& u 那么截取的时候只用考虑最右边的i个的字符9 v% C" K; m; c- d
0 Y, t- u' z: ?% B9 x/ K assume 左边都是英文单字的话,那右边的就全是中文;+ A: q+ i9 B g& ^: R
如果全是中文,那么有几个中文 就截取几个字符! X0 u2 y/ F" ^" {' I: P; c8 D
: b9 j2 i C: X3 a; c, z0 J1 X3 \迭代的函数 输入应该是字符串,输出应该是左起的n个字符
2 g1 T5 s, l! U' ? ^迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现), e- r- Z: U8 ]. I0 N/ |- ^# @
& K2 Q: b9 U" E迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代! _9 G r7 u; F# P( o
-------------------------------------------------------------------------------------------------------
, y. F% v" ]0 V yif(!String.prototype.leftB){ 8 b+ h- x% H, L! ]1 P1 p
String.prototype.leftB = function(n){ //n=7
# d9 G/ |! N5 Z+ [% U. ^( pvar s = this, //s="ilove我自己": r3 O# B5 Q- w! y+ \8 t8 B2 @
s2 = s.slice(0, n), //s2="ilove我自"" k" }- |& I K: f) p2 o; i
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9$ L. w5 B2 P" x1 _; A! f' W0 m% C
if (i <= n) { 1 {( k7 V' K& m8 m7 x
return s2; k
: H& K' s1 t$ ^. j}
6 r2 q$ U6 f9 \; j4 k( Oi -= s2.length;// i=9-7=2 , n =7,几个中文
8 r0 W1 @- }4 e0 |" c+ x# aswitch (i) { ) b0 n, N& M1 D& p
case 0: return s2; //全是单字节6 \, F' Z6 Y8 X4 S8 _4 }& }
case n: return s.slice(0, n >> 1); //全是双字节,比如中文6 b' Z8 E v& U
default:
% H* _+ q- n e! ?& [/ I; Nvar k = n - i, //k=7-2=5,几个英文字6 S& A* ~% W5 @
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
# T8 u$ O. N' q. T+ S9 qj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数5 x- Z+ c+ V0 V! X9 O
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
& R" \) X4 F; q! E9 E' S} ) q" V/ T0 m6 }5 ?, U, c
}
1 l$ n, f8 y" v}
$ X7 ]- s9 Z0 @% D, `/ A-----------------------------------------------------------------------------------------------------------------
3 l8 |* R; f w/ h8 Gvar stringify = function (obj) {
+ j& B, F* Q4 }6 m# y9 b8 V9 i) e var t = typeof (obj);- Y" Y! t4 R+ M9 L
if (t != "object" || obj === null) {. _ R6 N% k2 E$ w
// simple data type. u( g; H' M5 m5 V9 p
if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
! q3 i i( n. `' p return String(obj);
3 L% q+ G& a+ G( V( l4 \1 Y% I } else {* i9 m; s u4 q( N# J9 m
// recurse array or object5 b+ N% E9 d1 {& S. @8 m" K
var n, v, json = [], arr = (obj && obj.constructor == Array);% d# [8 s2 I7 S8 K8 x2 `
6 \0 ~- u( G" d! G% i1 g# f // fix.
5 d. p3 v: x" P$ v% K" b var self = stringify;
" A3 ]. \" @! e) N4 v0 y
" L, U+ H, z1 |/ r: W for (n in obj) {: M& O; {" q3 a0 T
v = obj[n];
; R" \% n/ R+ a+ Q( f" X) z5 U t = typeof(v);! W7 I1 i6 n! k9 X, v! `
if (obj.hasOwnProperty(n)) {
w$ w- p! H* R if (t == "string") {
' m8 n0 Z, y K6 t! a v = '"' + v + '"';
X2 Z2 `# O& { _; B, T, Z } else if (t == "object" && v !== null) {1 C8 M( S$ N% d! p2 t
v = self(v);
' F9 e* M7 B/ l; ~) T9 c, M }, t! R0 e/ D! s) {6 ^$ z0 c/ S
json.push((arr ? "" : '"' + n + '":') + String(v));0 P, a6 K9 d/ H9 R
}
; E( b7 i# K ~* I' c5 ~" f, [ }
' C V! n! e& {: g+ i- Q/ v& z8 a return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");+ [+ p4 q* @. H9 Z% ]
}
% O6 m( o, K+ \+ W" f& O$ p};' ~7 V+ T2 \) `# u4 n
: `- W, a/ Q' v( c( N }. g5 z6 j |
zan
|