如何访问其值为未知整数的JS对象属性?

时间:2017-03-17 07:21:02

标签: javascript json ajax mediawiki-api

此维基百科API调用返回的JSON响应是一系列嵌套对象。要沿着对象属性链向下移动并访问感兴趣的文本,我必须首先访问一个值为随机数的属性,这取决于我按标题查询的维基百科页面。

标题为"San%20Francisco"(页面ID = 49728)的页面的示例:

对象属性链

responseJSON.wiki[0].query.pages[<<page id>>].extract

示例API调用:https://en.wikipedia.org/w/api.php/?origin=*&format=json&action=query&prop=extracts&exintro=&explaintext=&titles=San%20Francisco

是否有某种方法可以识别其值为随机整数的属性?链中只有一个子页面,其值为整数。我想不出另一个解决方案,也不知道任何有效的JSON解析方法。

我对AJAX请求缺乏经验,并且正在使用jQuery以这种方式进行我的ajax调用。我想提一下,以防我做一些天真的事情:

var getWiki = function (obj) {
    return $.ajax({
        url: "http://en.wikipedia.org/w/api.php" +
            "?origin=*" + "&format=json" +
            "&action=query" + "&prop=extracts" +
            "&exintro=" + "&explaintext=" + "&titles=" +
            obj.position,
        method: 'GET'
    });
};

3 个答案:

答案 0 :(得分:1)

如果您的object只有一个密钥,则可以使用Object.keys(object)[0]获取该密钥,然后对原始object执行动态括号 - 表示法属性访问。 (这是dig实用程序在下面的示例中执行的操作。)

另请注意,您可以使用.promise()使JSON响应处理更加整洁。我建议您也将type: 'json'添加到您的AJAX请求中,这样您就不必自己解析字符串数据了。

function getWiki(obj) {
  return $.ajax({
    url: "http://en.wikipedia.org/w/api.php" +
      "?origin=*" + "&format=json" +
      "&action=query" + "&prop=extracts" +
      "&exintro=" + "&explaintext=" + "&titles=" +
      obj.position,
    method: 'GET',
    type: 'json'
  }).promise()
}


function dig(object) {
  return object[Object.keys(object)[0]]
}


getWiki({
    position: 'San Francisco'
  })
  .then(function(json) {
    console.log(
      dig(json.query.pages).extract //=> 'San Francisco (SF) ...'
    )
  })
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

答案 1 :(得分:1)

好吧,如果页面对象上总是有一个属性,那么你可以尝试使用任何一种方法:

if (typeof Object.values !== 'function') {
  Object.values = obj => Object.keys(obj).map(key => obj[key]);
}

const responseJSON = {
  "batchcomplete": "",
  "query": {
    "pages": {
      "49728": {
        "pageid": 49728,
        "ns": 0,
        "title": "San Francisco",
        "extract": "Some text"
      }
    }
  }
}

const pages = responseJSON.query.pages;

const extractedWithKeys = pages[Object.keys(pages)[0]];
const extractedObjValues = Object.values(pages)[0];

console.log(extractedWithKeys, extractedObjValues)

答案 2 :(得分:0)

如果将Object.keys参数添加到查询中,您实际上可以在没有indexpageids或其他类似技巧的情况下执行此操作。

示例API调用:https://en.wikipedia.org/w/api.php?action=query&format=json&prop=extracts&indexpageids=1&titles=San+Francisco&exintro=1&explaintext=1

示例JSON输出:

{
    "batchcomplete": "",
    "query": {
        "pageids": [
            "49728"
        ],
        "pages": {
            "49728": {
                "pageid": 49728,
                "ns": 0,
                "title": "San Francisco",
                "extract": "San Francisco (initials SF) <snip>"
            }
        }
    }
}

然后您可以使用类似data.query.pages[data.query.pageids[0]].extract的内容来获取摘录(但请记住,有时不会返回任何页面,具体取决于您使用的查询)。

维基百科API sandbox对于发现像indexpageids这样的参数非常有用 - 试验通常比阅读文档更快。