Javascript 使用未知数字的键处理对象
我正在使用Wikipedia的api,响应如下:Javascript 使用未知数字的键处理对象,javascript,angular,Javascript,Angular,我正在使用Wikipedia的api,响应如下: { 'query': { 'pages': { 212187: { 'extract': value; } } } } 我正在尝试获取提取值。然而,当我无法通过212187时,因为这个号码会随着我每次打电话而改变。
{
'query': {
'pages': {
212187: {
'extract': value;
}
}
}
}
我正在尝试获取提取值。然而,当我无法通过212187时,因为这个号码会随着我每次打电话而改变。这不允许我精确地建模响应对象。
我当前的模型在212187级别上没有定义,并且阻止我提取
我怎样才能做到这一点?如有任何帮助/建议/提示,将不胜感激
更新
我有一个与响应结构完全匹配的接口,但我的as编号为212187(假设这是错误的)。
我的请求如下:
fetchDescriptionWiki(qSearch: string) {
const params: URLSearchParams = new URLSearchParams();
params.set('origin', '*');
params.set('format', 'json');
params.set('action', 'query');
params.set('prop', 'extracts');
params.set('exintro', '');
params.set('explaintext', '');
params.set('indexpageids', '');
params.set('titles', qSearch);
const options = new RequestOptions({
search: params
});
return this.http.get(this.pendingCardsDescriptionWikiUrl, options)
.map(this.extractApiData);
}
getDescription() {
this.pendingCardService.fetchDescriptionWiki('SomeStringValue')
.subscribe(data => {
this.wikiResult = data;
});
}
提取数据:
private extractApiData(res: Response) {
const body = res.json();
return body || [];
}
My component.ts函数如下所示:
fetchDescriptionWiki(qSearch: string) {
const params: URLSearchParams = new URLSearchParams();
params.set('origin', '*');
params.set('format', 'json');
params.set('action', 'query');
params.set('prop', 'extracts');
params.set('exintro', '');
params.set('explaintext', '');
params.set('indexpageids', '');
params.set('titles', qSearch);
const options = new RequestOptions({
search: params
});
return this.http.get(this.pendingCardsDescriptionWikiUrl, options)
.map(this.extractApiData);
}
getDescription() {
this.pendingCardService.fetchDescriptionWiki('SomeStringValue')
.subscribe(data => {
this.wikiResult = data;
});
}
这就是我无法深入研究响应并获取提取值的原因。我使用Angular HttpClient(Angular 4+)从Wikipedia API提取查询中检索数据。然后通过数组索引(在本例中为索引0)将目标指向所需的页面,这样您就不需要知道页面id 我已经更新了答案,以使用示例中的类和方法名称。我建议升级到
HttpClient
,但是使用Angular 2的Http
也可以达到同样的效果
@Injectable()
export class PendingCardService {
private: string wikipediaUrl =
'https://en.wikipedia.org/w/api.php?action=query' +
'&format=json&prop=extracts&exintro=1&explaintext=1' +
'&origin=*&titles=Some_title';
fetchDescriptionWiki(): Observable<any> {
// this can use URLSearchParams as you did
return this.http.get(this.wikipediaUrl).map(this.extractApiData);
}
private extractApiData(res: Response): Foobar {
// json() is unnecessary in Angular 4+ as json() is automatically called
const body = res.json();
const pages = body.query.pages;
const pageKeys = Object.keys(pages);
// Retrieve the first page (index 0)
const page = pages[pageKeys[0]];
// ES6 object destructuring to get extract value
const { extract } = page;
// creating some object from retrieved value
const foobar: Foobar = { extract };
return foobar;
}
}
希望这有帮助 像这样:
interface IWikipediaData {
query: {
pages: {
[key: number]: {
extract: string
}
}
}
}
let example: IWikipediaData = {
query: {
pages: {
212187: {
extract: 'value'
}
}
}
}
你是说在类型方面?您需要类似于
{[key:number]:Extract}
的代码。您可以添加一些当前用于处理此数据结构的代码吗?您介意扩展您的解释@jornsharpe吗?你的意思是在界面中吗?我认为DeborahK需要知道页码才能获得提取值。将有助于实现setter自定义实现,并重新格式化响应,以获得更具开发性的对象。我不知道您在寻找模型定义,而不是提取数据的过程,希望它在某种程度上仍有帮助。谢谢老实说,我正在寻找两者。只是尝试获取提取值。我还没有更新到4.3.4,所以我还没有花时间使用HttpClient。我会调查的。谢谢更新了答案以使用您提供的类/方法名称。调用json()后,您应该能够通过Object.keys()
访问extract
属性。我使用这种方法(Angular 4+)专门在针对单个/特定页面标题时获取extract
属性。您最好访问从map()
执行的extractApiData()
中的值。