美人如花 发表于 2015-4-15 09:52

递归

截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
算法:
   英文是单字节字符,中文是双字节字符,
   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源

   假设n个字符里面,有 k个英文单字,i个中文双字
   那么截取的时候只用考虑最右边的i个的字符

   assume 左边都是英文单字的话,那右边的就全是中文;
   如果全是中文,那么有几个中文 就截取几个字符

迭代的函数 输入应该是字符串,输出应该是左起的n个字符
迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)

迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
-------------------------------------------------------------------------------------------------------
if(!String.prototype.leftB){
String.prototype.leftB = function(n){ //n=7
var s = this, //s="ilove我自己"
s2 = s.slice(0, n), //s2="ilove我自"
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
if (i <= n) {
return s2; k
}
i -= s2.length;// i=9-7=2 , n =7,几个中文
switch (i) {
case 0: return s2; //全是单字节
case n: return s.slice(0, n >> 1); //全是双字节,比如中文
default:
var k = n - i, //k=7-2=5,几个英文字
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
}
}
}
-----------------------------------------------------------------------------------------------------------------
var stringify = function (obj) {
    var t = typeof (obj);
    if (t != "object" || obj === null) {
        // simple data type
        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
        return String(obj);
    } else {
        // recurse array or object
        var n, v, json = [], arr = (obj && obj.constructor == Array);

        // fix.
        var self = stringify;

        for (n in obj) {
            v = obj;
            t = typeof(v);
            if (obj.hasOwnProperty(n)) {
                if (t == "string") {
                    v = '"' + v + '"';
                } else if (t == "object" && v !== null) {
                    v = self(v);
                }
                json.push((arr ? "" : '"' + n + '":') + String(v));
            }
        }
        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    }
};

页: [1]
查看完整版本: 递归