0

JSON.stringify に問題があります

ページからすべてのメタ タグを引き出し、それらを Firefox ワーカー ファイルに渡して処理し、オブジェクトを返そうとしています。

そのため、以前はワーカーを実行していなかったときにコードが機能していましたが、ワーカー ファイルを使用するようになったときにのみ問題が発生しました (詳しく説明できないため、ワーカーを使用する必要があります!)

したがって、以前はすべてのメタタグを取得していました

var metas = document.getElementsByTagName("meta");

次に、次を使用してメタオブジェクトをループできます

for (var index in metas){
  var currentMeta = metas[index];
//(and so on, this code worked perfectly)

外部ワーカー ファイル シナリオに移行すると、問題が発生します。何が起こるかというと、通常どおりメタ タグを引き出してから、ワーカーにプッシュできるものに JSON.stringify を使用します。

すべてのイントロ ブラブの後、ここに私の問題の根源があります。

<meta content="width=1024" name="viewport">
<meta charset="UTF-8">
<meta content="Mozilla Hacks – the Web developer blog" name="title">

次のコードを実行すると、配列が取得されます

var metas = document.getElementsByTagName("meta");

配列 3 要素を返します

[meta, meta, meta]

次を使用して文字列化すると:

var jsonMetas = JSON.stringify(metas);

私はjsonMetasが次のようなものを保持することを期待しています:

{"0":{"content":"width=1024","name":"viewport"},"1":{"charset":"UTF-8"},"2":{"content":"Mozilla Hacks - the web developer blog","name":"title"} }

ただし、jsonMetas オブジェクトを見ると、次のように返されます。

{"0":{"constructor":{}},"1":{"constructor":{}},"2":{"constructor":{}}}

は?????

私は JavaScript があまり得意ではないので、(非常に短い言葉で:)) 何が起こっているのか説明していただけますか?

stringify 呼び出しが異常に構造化されたオブジェクトを返すのはなぜですか? 私は何を間違っていますか?

ご回答ありがとうございます。

4

2 に答える 2

2

を使用できます。

var metas = document.getElementsByTagName("meta");
var arr = [];
for (var i = 0; i < metas.length; i++) {
    var obj = {};
    for (var j = 0; j < metas[i].attributes.length; j++) {
        var att = metas[i].attributes[j];
        obj[att.name] = att.value;
    }
    arr.push(obj);
}

var jsonMetas = JSON.stringify(arr);
console.log(jsonMetas);​

結果:

[
    {
        "http-equiv": "content-type",
        "content": "text/html; charset=UTF-8"
    },
    {
        "content": "width=1024",
        "name": "viewport"
    },
    {
        "charset": "UTF-8"
    },
    {
        "content": "Mozilla Hacks – the Web developer blog",
        "name": "title"
    }
]
于 2012-06-03T08:43:03.903 に答える
1

これは、document.getElementsByTagNameが JSON を返さず、XML を返すためです。したがって、目的の出力を得るには、次のようなものを使用する必要があります。

var jsonMetas = [];
for (i=0 ; i<metas.length ; i++) {
    var thisMeta = {};
    for (j=0 ; j<metas[i].attributes.length ; j++) {
        thisMeta[metas[i].attributes[j].name] = metas[i].attributes[j].value;
    }
    jsonMetas.push(thisMeta);
}

このページの JSON.stringify(jsonMetas) の出力:

"[{"name":"relativepagescore","content":"0"},{"name":"title","content":"javascript - JSON.stringifyがarray.objectを正しく変換しない - コードログ"} ]"

于 2012-06-03T08:42:56.530 に答える