美文网首页
记一个代码题

记一个代码题

作者: shanshanfei | 来源:发表于2018-05-16 20:50 被阅读0次

    区分 数组 还是 对象,我当时脑子肯定进水了...Array.isArray([])都没想起来, 用typeof还不如用instanceof:data instanceof Array,我想不起来的那种方式是:Object.prototype.toString.call([]) === '[object Array]', Object.prototype.toString.call({}) === '[object object]'

    //其中 健壮性暂未想那么多,烦人的紧张...
    // https://job.youzan.com/coding/room/8a80fb97-e52f-4730-a439-e58b690e853c?key=xKHD
    // 将 下面的数据 健值 转换成 驼峰的格式,如:a_b --> aB
    // 在将他的输出转换为 下划线的形式,如:aB --> a_b
    // 除了实现功能外,尽量将2个函数的公共部分进行抽离 形成公共的函数,减少代码量
    const testData = {
        a_b: 1,
        s__ss: 2,
        a_f: [ 1,2,3, {
            f_s: 43
        }],
        a_3: {
            d_4: 44
        }
    }
    
    
    // a_b => aB
    
    /**
     * 
     * @param {Array | Object} data
    */
    function camelCaseToUnderscore(data) {
        //错误判断
    
        //key 转换
        var keyChange = function(key){
            let key_arr = key.split('');
            key_arr.forEach((v, i) => {
                if(v === '_' && key_arr[i+1]){
                    key_arr[i+1] = key_arr[i+1].toUpperCase();
                }
            });
            
            let new_key = key_arr.filter(v => v !== '_').join('');
            return new_key;
        }
    
        return commonFun(data, keyChange, camelCaseToUnderscore);
    }
    
    function commonFun(data, keyFun, cb){
        let new_data = typeof data.splice !== 'function' ? {} : [];
        for(let key in data){
            let new_key = keyFun(key);
            if(typeof data[key] !== 'object'){//简单类型
                new_data[new_key] = data[key];           
            }else{//对象
               new_data[new_key] = cb(data[key]);
            }
        }
        return new_data;
    }
    
    function underscoreToCamecase(data) {
        //公共的错误判断
    
        //key 转换
        var keyChange = function(key){
            let key_arr = key.split(''), arr = [];
            key_arr.forEach((v, i) => {
                if(/[A-Z]/.test(v)){
                    arr.push('_');
                }
                arr.push(v.toLowerCase())
            });
            
            let new_key = arr.join('');
            return new_key;
        }
    
        return commonFun(data, keyChange, underscoreToCamecase);
    }
    
    
    console.log(camelCaseToUnderscore(testData))
    let testData2 = camelCaseToUnderscore(testData);
    console.log(underscoreToCamecase(testData2));
    

    订阅者/发布者(观察者)模式的js实现

    相关文章

      网友评论

          本文标题:记一个代码题

          本文链接:https://www.haomeiwen.com/subject/zxmmdftx.html