记一个代码题

区分 数组 还是 对象,我当时脑子肯定进水了...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实现

你可能感兴趣的:(记一个代码题)