关于javascript:如何访问值是未知整数的JS对象属性?

How can I access a JS object property whose value is an unknown integer?

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

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

对象属性链:

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

API调用示例:https://en.wikipedia.org/w/api.php/?origin=*


好吧,如果pages对象上总是有一个属性,那么您可以尝试以下任何一种方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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)


如果您的object只有一个键,则可以使用Object.keys(object)[0]来获取它,然后在原始的object上执行动态括号符号属性访问。 (这是dig实用程序在下面的示例中所做的。)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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) ...'
    )
  })
1
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">


如果将indexpageids参数添加到查询中,则实际上可以执行此操作而无需Object.keys或其他类似的技巧。

API调用示例:https://en.wikipedia.org/w/api.php?action=query