注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Computer Science

I Pressed My Words Here. Will You Read ?

 
 
 

日志

 
 

JavaScript 对象结构展示方法 —— showMe —— 用于查看数据对象结构  

2013-01-24 16:37:44|  分类: My Projects |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
通常在JavaScript编程中,常遇见组件事件中有入参,或者后台返回结果,由于文档不完善之类的原因,需要了解对象数据结果,故在一年前写了此方法,在调试错误时也很有用。(解析XML、DOM之类的对象好像不支持,只返回类型名称)。
showMe(sourceCode);

/*for test only*/
/*versin 2013-2-18*/

/*
     * typeOf({},['object','string']) == true;
     *
     * typeOf({},'object) == true;
     *
     * typeOf({}) == 'Object'
     *
     * typeOf(null, 'Object') == false;
     *
     * typeOf(function(){},'function') == true;
     *
     * typeOf(undefined, 'undefined') == true;
     *
     * typeOf(null,'null') == true;
     *
     * typeOf() == 'undefined';
     *
     * typeOf(NaN) == 'NaN';
     */
if (!typeOf) {
    var typeOf = function(obj, type) {
        /*
         * if (obj == undefined || obj == null) { if (type == undefined || type ==
         * null) { return true; } else { return false; } }
         */
        var clas;
        if (obj === undefined) {
            clas = 'Undefined';
        } else if (obj === null) {
            clas = 'Null';
        } else {
            clas = Object.prototype.toString.call(obj).slice(8, - 1);
            if (clas.toLowerCase() == 'number' && isNaN(obj)) {
                clas = 'NaN';
            }
        }
        // 分析type的类型
        if (type != undefined && type != null) {
            if (typeOf(type) == 'Array') {
                var length = type.length;
                while (length-- > 0) {
                    if (typeOf(type[length], 'String') && clas.toLowerCase() == type[length].toLowerCase()) {
                        clas = true;
                        break;
                    }
                }
                delete length;
            } else if (typeOf(type) == 'String') {
                clas = clas.toLowerCase() == type.toLowerCase();
            }
        }
        return clas;
        delete clas;
        delete arguments;
        /**/
    };
}

/*
     * 测试用
     *
     * paam "functionName":true(when object is a function only show its name and
     * "function()"); "maxDepth":1(means only scan one level of the object's
     * elements, return a '...' to replace the deeper level's);
     * "newWindow":true,(show message in a new Browser window)
     *
     * showMe([{a:'b',b:1,c:[function(){return 'e';}]}]);
     * showMe([{a:'b',b:1,c:[function(){return 'e';}]}],
     * {'functionNameOnly':true, 'burning':'CPU','newWindow':false});
     * showMe([{a:'b',b:1,c:[function(){return
     * 'e';}]}],{functionNameOnly:false,
     * maxDepth:1,burning:'CPU',newWindow:true}); notice: if stack overflow
     * please try to use burnig:'CPU', and set the maxDepth low;
     */
var g_showMe = g_showMe || true;
if (!showMe) {
    var showMe = function(obj) {
        var allShowMe = true; // 全局开关
        if (allShowMe && g_showMe) {
            arguments[1] = arguments[1] || {};
            arguments[1]['burning'] = arguments[1]['burning'] || undefined;
            var newWindow = arguments[1]['newWindow'] || undefined;
            function openWin(str) {
                myWindow = window.open('', '', '');
                if (myWindow) {
                    myWindow.document.write(str);
                    myWindow.focus();
                }
            }
            function popup(str) {
                if (newWindow) {
                    openWin(str);
                } else {
                    alert(str);
                }
            }
            if (arguments[1] == 'alert') {
                popup(obj);
            } else if (typeOf(arguments[1], 'object')) {
                if (arguments[1]['burning'] == 'CPU') {
                    popup(getString(obj, arguments[1]));
                } else {
                    popup(getStr(obj, arguments[1]));
                }
            }
        }
    };
}
// 将字符串 数组 对象 以字符串的形式返回。
if (!getStr) {
    var getStr = function(obj) {
        var str = '';
        if (typeOf(arguments[1], 'String')) {
            var argumentsObj = {};
            argumentsObj[arguments[1]] = true;
            arguments[1] = argumentsObj;
        }
        arguments[1] = arguments[1] || {};
        var getStrLevel = arguments[1].getStrLevel = arguments[1].getStrLevel || 1;
        var maxDepth = arguments[1].maxDepth;
        if (typeOf(maxDepth, 'number') && getStrLevel++ > maxDepth) {
            return '...';
        }
        var command = arguments[1] || {};
        var typeValue = typeOf(obj);
        switch (typeValue) {
        case 'String':
            str = str + '"' + String(obj) + '"';
            break;
        case 'Array':
            var length = obj.length;
            str = str + '[';
            for (var i = 0; i < length; i++) {
                str = str + getStr(obj[i], arguments[1]) + ',';
            }
            var lio = str.lastIndexOf(',');
            lio = lio == - 1 ? str.length: lio;
            str = str.substring(0, lio) + ']';
            delete lio;
            delete length;
            break;
        case 'Error':
        case 'Object':
            str = str + '{';
            try {
                for (var prop in obj) {
                    str = str + '"' + prop + '"' + ':' + getStr(obj[prop], arguments[1]) + ',';
                }
            } catch(e) {
                if (!jQuery.isPlainObject(obj)) {
                    str = str + 'object';
                    break;
                }
            }
            var lio = str.lastIndexOf(',');
            lio = lio == - 1 ? str.length: lio;
            str = str.substring(0, lio) + '}';
            delete lio;
            delete prop;
            break;
        case 'Number':
            str = str + obj;
            break;
        case 'Function':
            if (command == 'functionNameOnly' || command.functionNameOnly) {
                str = str + 'function()';
            } else {
                str = str + String(obj);
            }
            break;
        case 'Boolean':
            str = str + String(obj);
            break;
        case 'RegExp':
            str = str + String(obj);
            break;
        case 'Date':
            str = str + (obj.toSource === undefined?obj.toString():obj.toSource());
            break;
        default:
            str = str + '[object ' + typeValue + ']';
            break;
        }
        delete typeValue;
        delete command;
        delete arguments;
        return str;
        delete str;
    };
}
/*
     * get object string by burning CPU
     */
if (!getString) {
    var getString = function(obj) {
        var result = {
            'string': ''
            ,'hasChild': true
            ,'child': obj
        };
        var pathArray = [0];
        var typeValue = typeOf(obj);
        arguments[1] = arguments[1] || {};
        if (typeOf(arguments[1], 'String')) {
            var argumentsObj = {};
            argumentsObj[arguments[1]] = true;
            arguments[1] = argumentsObj;
        }
        var command = arguments[1] || {};
        var currentLevel = 0;
        do {
            var length = pathArray.length;
            arguments[1]['pathLevel'] = currentLevel;
            arguments[1]['pathNo'] = pathArray[currentLevel];
            var rs = analyseTarget(result['child'], arguments[1]) || {};
            result['hasChild'] = rs['hasChild'];
            result['child'] = rs['child'];
            if (currentLevel == length - 1) { // while digging deeper
                result['string'] = result['string'] + rs['string'];
                //alert(result['string'] + '\n\rlength: ' + length + '\n\rcurrentLevel: ' + currentLevel);
                if (rs['hasChild']) {
                    pathArray[length] = 0;
                    currentLevel++;
                } else { // reach the end, go back to the top to refind the parent obj.
                    result['child'] = obj;
                    currentLevel = 0;
                    if (length > 1) {
                        pathArray.pop();
                        var index = pathArray.length - 1;
                        pathArray[index] = pathArray[index] + 1;
                    } else {
                        break;
                    }
                }
            } else { // while refinding the deepest obj.
                currentLevel++;
            }
        } while (true)
        delete command;
        delete typeValue;
        delete pathArray;
        delete arguments;
        return result['string'];
    }
}
/**
     * for "getting string by burning CPU", return piece of result string and
     * state(true/false:keep diging or not)
     */
if (!analyseTarget) {
    var analyseTarget = function(obj) {
        // preparing
        var rs = {
            'string': ''
            ,'hasChild': false
            ,'child': null
        };
        var typeValue = typeOf(obj);
        var noFunction = arguments[1].noFunction;
        if (noFunction && typeValue == 'Function') {
            return rs;
        }
        arguments[1] = arguments[1] || undefined;
        if (typeOf(arguments[1], 'String')) {
            var argumentsObj = {};
            argumentsObj[arguments[1]] = true;
            arguments[1] = argumentsObj;
        }
        arguments[1] = arguments[1] || {};
        var pathLevel = arguments[1].pathLevel = arguments[1].pathLevel || 1;
        var maxDepth = arguments[1].maxDepth;
        if (typeOf(maxDepth, 'number') && pathLevel++ > maxDepth) {
            rs['string'] = '[object ' + typeValue + ']';
            return rs;
        }
        var command = arguments[1] || {};
        var pathNo = command.pathNo || 0;
        // start
        switch (typeValue) {
        case 'String':
            rs['string'] = '"' + String(obj) + '"';
            rs['hasChild'] = false;
            rs['child'] = null;
            break;
        case 'Array':
            var length = obj.length;
            if (length < 1) {
                rs['string'] = '[]';
                rs['hasChild'] = false;
                rs['child'] = null;
                break;
            }
            if (pathNo < length) {
                if (pathNo == 0) {
                    rs['string'] = '[';
                } else if (pathNo > 0) {
                    rs['string'] = ',';
                }
                rs['hasChild'] = true;
                rs['child'] = obj[pathNo];
            } else if (pathNo == length) {
                //if(pathNo == 0){ rs['string'] = '['; }// this situation is already inclued in condition of "if(length<1)"
                rs['string'] = ']';
                rs['hasChild'] = false;
                rs['child'] = null;
            }
            break;
        case 'Error':
        case 'Object':
            var count = - 1;
            try {
                for (var prop in obj) { // when count is equal pathNo, we get the child and continue, if count is larger than pathNo, then we will know this is not the last child.
                    count++;
                    if (count < pathNo) {} else if (count == pathNo) {
                        if (pathNo == 0) {
                            rs['string'] = '{';
                        } else if (pathNo > 0) {
                            rs['string'] = ',';
                        }
                        rs['string'] = rs['string'] + '"' + prop + '"' + ':';
                        rs['hasChild'] = true;
                        rs['child'] = obj[prop];
                    } else if (count > pathNo) {
                        break;
                    }
                }
            } catch(e) {
                if (!jQuery.isPlainObject(obj)) {
                    rs['string'] = 'object'
                    rs['hasChild'] = false;
                    rs['child'] = null;
                    break;
                }
            }
            if (!rs['hasChild'] && count == - 1) { // obj does not have a child at all.
                rs['string'] = '{}';
            } else if (!rs['hasChild'] && count < pathNo) { // rs['child'] == obj last child
                rs['string'] += '}';
            }
            delete prop;
            delete count;
            break;
        case 'Number':
            rs['string'] = obj;
            rs['hasChild'] = false;
            rs['child'] = null;
            break;
        case 'Function':
            if (command == 'functionNameOnly' || command.functionNameOnly) {
                rs['string'] = 'function()';
            } else {
                rs['string'] = String(obj);
            }
            rs['hasChild'] = false;
            rs['child'] = null;
            break;
        case 'Boolean':
            rs['string'] = String(obj);
            break;
        case 'RegExp':
            rs['string'] = String(obj);
            break;
        case 'Date':
            rs['string'] = obj.toSource();
            break;
        default:
            rs['string'] = '[object ' + typeValue + ']';
            break;
        }
        return rs;
    }
}







——————————————————————
2013-3-28 11:11:03
发现了个前人写的类似的js代码,用于分析对象并输出(好像是以新页面的仰视输出的),叫dump:
http://www.netgrow.com.au/files/javascript_dump.cfm

END
  评论这张
 
阅读(735)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017