【问题标题】:How to process an object literal?如何处理对象文字?
【发布时间】:2009-07-25 20:25:58
【问题描述】:

我是 Javascript 新手,正在尝试提取存储在对象中的一些文本。

对象被定义为对象字面量,并被传递给调用该函数的Javascript script 中的函数。脚本(和对象)具有以下结构:

foo({
  "query": {
  "count": "2",
  "created": "2009-07-25T08:17:54Z",
  "lang": "en-US",
  },
  "results": {
   "result": [
    {
     "abstract": "<b>Pizza</b> Hut®. Order Online for Delivery or Carry-out. Fast &amp; Easy.",
     "title": "<b>Pizza</b> Hut"
    },
    {
     "abstract": "Official site of Domino's <b>Pizza</b> delivery chain, which offers thin crust, deep dish, and hand tossed <b>pizzas</b> with a variety of side items and beverages. Site <b>...</b>",
     "title": "Domino's <b>Pizza</b>"
    }
   ]
  }
 }
});

对象被传递给名为“foo”的回调函数:

function foo(o){
  var out = document.getElementById('container');
  out.innerHTML = o.query.count;
}

我的问题:我知道如何使用上面的回调函数打印出查询计数变量,但我不知道如何打印出结果数组中第一个结果的标题.

如何更改回调函数以显示第一个结果标题? 另外,是否有一个 foreach 语句,我可以在其中打印出所有结果中的所有标题?

谢谢!

更新:此代码的 JSBIN 位于:http://jsbin.com/ejiwa/edit

【问题讨论】:

  • 问题是错误的 - 你不解析 JSON,你使用复合 JavaScript 变量
  • @chris:您的代码中有一个错字 - 在您对 foo() 的调用结束时,您有一个额外的右括号。
  • @Richie:谢谢我没注意到

标签: javascript json yql


【解决方案1】:

做以下工作:

o.results.result[0].title

获得第一个结果标题?并遍历所有结果:

for (var i=0; i<o.results.result.length; i++) {
    var result = o.results.result[i];
    alert(result.title);
}

编辑:你确定你复制对了吗?这是我在 Rhino 中得到的:

js> o = {
  "query": {
  "count": "2",
  "created": "2009-07-25T08:17:54Z",
  "lang": "en-US",
  },
  "results": {
   "result": [
    {
     "abstract": "<b>Pizza</b> Hutr. Order Online for Delivery or Carry-out. Fast &amp; Easy.",
     "title": "<b>Pizza</b> Hut"
    },
    {
     "abstract": "Official site of Domino's <b>Pizza</b> delivery chain, which offers thin crust, deep dish, and hand tossed <b>pizzas</b> with a variety of side items and beverages. Site <b>...</b>",
     "title": "Domino's <b>Pizza</b>"
    }
   ]
  }
 }

js> o.results.result[0].title
<b>Pizza</b> Hut

【讨论】:

  • @chris:ars 的代码非常适合我,尽管我确实必须更正您代码中的错字 - 在您对 foo() 的调用结束时,您有一个额外的右括号。
  • 很奇怪。查看我刚刚从我身边粘贴的输出。
  • 啊。刚刚看到@Richie 的评论。好收获!
  • 这里是 jsbin 文件:jsbin.com/ejiwa/edit 我无法让它工作。你能看看它在那里工作吗?
  • 有趣。那行得通,但是当我从 src (query.yahooapis.com/v1/public/…) 中取出 JSON 变量并将其放入时,它不起作用。你知道为什么吗?
【解决方案2】:

我不确定你的回调函数中的 o 参数是什么。 我通常将 XMLHttpRequest 或 ActiveXObject 分配给全局 var req。

然后使用回调:

 function json_callback() {
    if (req.readyState == 4) {
            if (req.status == 200) {
                    jsonObj = eval("(" + req.responseText + ")");
                    var out = document.getElementById('container');
                    out.innerHTML = jsonObj.query.count;
            }
       }
 }

需要注意的是,只有在完全信任服务器和服务器发送给客户端的数据的情况下,才应该使用 eval()。有可用的 JSON 解析器,它们实际上比 eval() 更快,也更安全,因为它们将其限制为仅 JSON,而 eval() 可以解析和执行所有可能存在安全风险的 JavaScript。预计在下一版本的 ECMAScript 中将内置一个标准的 JSON 解析器。

【讨论】:

    【解决方案3】:

    actual object 的结构与您所写的略有不同。 results 实际上是query 的一个元素。所以试试这个:

    o.query.results.result[0].title
    

    【讨论】:

    • 我想我在尝试美化代码时犯了一个错误,但萤火虫说:o.query.results is undefined
    • 当我在雅虎的原始数据上运行它时,它对我有用。 function foo(o) { return o.query.results.result[0].title; } 返回&lt;b&gt;Pizza&lt;/b&gt; Hut
    【解决方案4】:

    从 JSON 中可以看出,该对象有一个名为“results”的属性,其中包含一个名为“result”的属性,它是一个对象数组。

    要显示第一个,您只需按照之前对 count 所做的操作,但只需按照标题的结构即可。

    o.query.results.result[0].title
    

    要遍历每个结果,您可以像数组一样简单地遍历 result 属性,例如:

    var results = o.query.results.result;
    for(var i = 0; i < results.length; i++) {
    
    }
    

    JSON 只是 JavaScript 代码。将 JSON sn-p 视为 JavaScript 对象声明,您应该毫无问题地理解它。

    【讨论】:

    • 使用这个语句:out.innerHTML = o.results.result[0].title;好像没用。
    • 啊数字.. o.query.results.result[0].title 是正确的路径:P 看起来您粘贴的 JSON sn-p 中有错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 2011-10-13
    • 2016-01-16
    • 2012-06-06
    • 2018-08-19
    相关资源
    最近更新 更多