0

JSON.stringify 有问题

我正在尝试将所有元标记从页面中拉出并将它们传递给 Firefox 工作文件以处理它们并返回一个对象。

因此,当我没有工作人员运行问题时,我的代码以前可以工作,只有在我转向使用工作人员文件时才出现(由于我无法进入的原因,我需要使用工作人员!)

所以以前我会使用

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

然后我可以使用循环遍历 metas 对象

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

当我移动到外部工作文件方案时会出现问题。发生的情况是我像往常一样拉出元标记,然后我使用 JSON.stringify 来推送我可以推送给工作人员的东西。

在所有这些介绍性废话之后,这是我的问题的根源:例如,我登陆一个页面,其中包含以下 html 代码

<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 回答