Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用未知数字的键处理对象_Javascript_Angular - Fatal编程技术网

Javascript 使用未知数字的键处理对象

Javascript 使用未知数字的键处理对象,javascript,angular,Javascript,Angular,我正在使用Wikipedia的api,响应如下: { 'query': { 'pages': { 212187: { 'extract': value; } } } } 我正在尝试获取提取值。然而,当我无法通过212187时,因为这个号码会随着我每次打电话而改变。

我正在使用Wikipedia的api,响应如下:

{
 '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()
中的值。