[解決済み] JavaScriptデータフォーマット/プリティプリンタ
質問
私はデバッグのために、人間が読める形で JavaScript のデータ構造を印刷する方法を見つけようとしています。
私は、かなり大きく複雑なデータ構造をJSに保存しており、それを操作するためにいくつかのコードを書く必要があります。私が何をしているか、どこで間違っているかを調べるために、私が本当に必要とするのは、データ構造を全体的に見ることができ、私がUIを通して変更を加えるたびにそれを更新することです。
JavaScript のデータ構造を人間が読める文字列にダンプする良い方法を見つけることを除けば、このようなことはすべて自分で処理できます。JSON は可能ですが、きれいにフォーマットされ、インデントされる必要があります。私は通常、このためにFirebugの優れたDOMダンプ機能を使用しますが、私は本当に構造全体を一度に見ることができる必要があり、それはFirebugでは不可能なようです。
どのように解決するのですか?
私は、出力がインデントされていないものの、読みやすいフォームでJSオブジェクトをダンプする関数を書きましたが、それを追加することはそれほど難しくないはずです。私はこの関数を、このインデント問題を処理する Lua (これははるかに複雑です) 用に作成したものから作りました。
以下はそのシンプルなバージョンです。
function DumpObject(obj)
{
var od = new Object;
var result = "";
var len = 0;
for (var property in obj)
{
var value = obj[property];
if (typeof value == 'string')
value = "'" + value + "'";
else if (typeof value == 'object')
{
if (value instanceof Array)
{
value = "[ " + value + " ]";
}
else
{
var ood = DumpObject(value);
value = "{ " + ood.dump + " }";
}
}
result += "'" + property + "' : " + value + ", ";
len++;
}
od.dump = result.replace(/, $/, "");
od.len = len;
return od;
}
少し改良して見ます。
注1:使用するには、次のようにします。
od = DumpObject(something)
と入力し、od.dumpを使用します。別の目的でlenの値(アイテムの数)も欲しかったので、複雑になりました。関数が文字列だけを返すようにするのは些細なことです。
注2:リファレンスのループは扱えません。
EDIT
無印版を作りました。
function DumpObjectIndented(obj, indent)
{
var result = "";
if (indent == null) indent = "";
for (var property in obj)
{
var value = obj[property];
if (typeof value == 'string')
value = "'" + value + "'";
else if (typeof value == 'object')
{
if (value instanceof Array)
{
// Just let JS convert the Array to a string!
value = "[ " + value + " ]";
}
else
{
// Recursive dump
// (replace " " by "\t" or something else if you prefer)
var od = DumpObjectIndented(value, indent + " ");
// If you like { on the same line as the key
//value = "{\n" + od + "\n" + indent + "}";
// If you prefer { and } to be aligned
value = "\n" + indent + "{\n" + od + "\n" + indent + "}";
}
}
result += indent + "'" + property + "' : " + value + ",\n";
}
return result.replace(/,\n$/, "");
}
再帰呼び出しのある行でインデントを選択し、この後のコメント行を切り替えてスタイルを整えます。
... あなた独自のバージョンを作成したようですが、これは良いことです。訪問者が選択できるようになります。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] TypeScriptのdeclare classとinterfaceの違いとは?
-
[解決済み] jQuery scroll() は、ユーザーがスクロールを止めたことを検出する。
-
[解決済み] React Router v4 <NavLink>と<Link>の違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] JavaScriptで次の要素/前の要素を取得しますか?
-
[解決済み] なぜJavaScriptでは!{}[true]がtrueに評価されるのですか?
-
[解決済み] 文字列がすべて同じ部分文字列で構成されているかどうかを調べるにはどうすればよいですか?
-
[解決済み] CORS OriginヘッダーとCSRFトークンによるCSRF保護
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
-
[解決済み] JavaScriptでjson-objectのキーを取得する [重複].
-
[解決済み] Node.jsのES6クラスをrequireで作る
-
[解決済み] node.js シェルコマンドの実行
-
[解決済み] async-await from functionを使用して非同期関数から値を返すには?重複