ochalog

RubyとMediaWikiとIRCが好き。

JavaScript 版 var_dump

昨日 Skype 上で、「JavaScriptPHPvar_dump みたいなことができないか」という話が出たので、さらっと書いてみた。以下の点で不完全だが、書き殴りコードにつきご勘弁を。

  • (配列を含む)オブジェクトのキーが文字列でなくても文字列と区別できない。
  • 循環参照があると無限ループする。注意。
/*jslint devel: true */
 
function dump(value) {
    'use strict';
 
    if (typeof value !== 'object') {
        console.log(value);
        return;
    }
 
    var indent = '  ';
 
    // オブジェクトを再帰的に展開して、内容を表す文字列を返す
    function dumpRec(object, depth) {
        var isArray = Array.isArray(object),
            result = (isArray ? '[' : '{') + '\n',
            lines = [],
            v,
            s,
            key,
            i;
 
        for (key in object) {
            if (object.hasOwnProperty(key)) {
                s = '';
                v = object[key];
 
                for (i = -1; i < depth; i += 1) {
                    s += indent;
                }
 
                s += key + ': ' +
                    (typeof v === 'object' ?
                            dumpRec(v, depth + 1) : v);
 
                lines.push(s);
            }
        }
 
        result += lines.join(',\n') + '\n';
 
        for (i = 0; i < depth; i += 1) {
            result += indent;
        }
 
        result += isArray ? ']' : '}';
 
        return result;
    }
 
    console.log(dumpRec(value, 0));
}
 
var a = [1, 2, {a: 3, b: 4}, [5]];
dump(a);
/*
 * 以下が出力される
 * [
 *   0: 1,
 *   1: 2,
 *   2: {
 *     a: 3,
 *     b: 4
 *   },
 *   3: [
 *     0: 5
 *   ]
 * ]
 */