将内部对象 属性 更改为 TypeScript 中的数组
Changing an inner object property to an array in TypeScript
就出现了这样的问题,折腾了几天,我还是个菜鸟。
使用维基百科的 GET 请求 API,我得到 this object
事实证明,对于 pages 对象,属性(也是一个对象)的名称始终等于 pageid(在本例中为“9475”)。如果事先不知道该对象的名称,我如何才能访问该对象?
那么这个对象必须转成数组才能使用ngFor
这个对象是我在search.component.ts
中使用showArticleInformation方法得到的
search.component.ts
import { Component, OnInit } from '@angular/core';
import { Article, ArticleInformation, ArticlesService } from '../../services/articles.service';
@Component({
selector: 'app-search',
templateUrl: './search.component.html',
styleUrls: ['./search.component.css'],
providers: [ArticlesService]
})
export class SearchComponent implements OnInit {
constructor(private articlesServices: ArticlesService) { }
searchQuery: string;
articles: { };
articleInformation: ArticleInformation;
getUrl(searchQuery: string) {
return 'https://ru.wikipedia.org/w/api.php?action=opensearch&profile=strict&search='
+ searchQuery + '&limit=100&namespace=0&format=json&origin=*';
}
getUrlInformation(searchQuery: string) {
return 'https://ru.wikipedia.org/w/api.php?action=query&titles='
+ searchQuery + '&prop=info&format=json&origin=*';
}
showArticles() {
this.articlesServices.getArticles(this.getUrl(this.searchQuery))
.subscribe(
(data: Article) => this.articles = Object.values({ ...data })
);
}
showArticleInformation() {
this.articlesServices.getArticleInformation(this.getUrlInformation(this.searchQuery))
.subscribe(
(data: ArticleInformation) => this.articleInformation = { ...data }
);
console.log(this.articleInformation);
}
ngOnInit() {
}
}
articles.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { retry } from 'rxjs/operators';
export interface Article {
title: string;
collection: string[];
description: string[];
links: string[];
}
export interface ArticleInformation {
batchComplete: string;
query: {
pages: { }
};
}
@Injectable({
providedIn: 'root'
})
export class ArticlesService {
constructor(private http: HttpClient) { }
getArticles(url) {
return this.http.get<Article>(url)
.pipe(
retry(3),
);
}
getArticleInformation(url) {
return this.http.get<ArticleInformation>(url)
.pipe(
retry(3),
);
}
}
如果您确定 pages
将始终有一个 属性 而您只需要它 value
,您可以使用 Object.values
执行类似的操作:
const data = {
batchComplete: "",
query: {
pages: {
"9745": {
pageid: 9745,
length: 48,
lastrevid: 100,
contentmodel: "wikitext",
touched: "2019-02-01"
}
}
}
}
const articleInformation = {
...data,
query: {
pages: [Object.values(data.query.pages)[0]]
}
}
console.log(articleInformation)
但是,this.articleInformation
和 data
需要单独的 interface
,因为它们具有不同的结构。
像这样:
export interface ArticleInformationNew {
batchComplete: string;
query: {
pages: any[]
};
}
就出现了这样的问题,折腾了几天,我还是个菜鸟。
使用维基百科的 GET 请求 API,我得到 this object
事实证明,对于 pages 对象,属性(也是一个对象)的名称始终等于 pageid(在本例中为“9475”)。如果事先不知道该对象的名称,我如何才能访问该对象?
那么这个对象必须转成数组才能使用ngFor
这个对象是我在search.component.ts
中使用showArticleInformation方法得到的search.component.ts
import { Component, OnInit } from '@angular/core';
import { Article, ArticleInformation, ArticlesService } from '../../services/articles.service';
@Component({
selector: 'app-search',
templateUrl: './search.component.html',
styleUrls: ['./search.component.css'],
providers: [ArticlesService]
})
export class SearchComponent implements OnInit {
constructor(private articlesServices: ArticlesService) { }
searchQuery: string;
articles: { };
articleInformation: ArticleInformation;
getUrl(searchQuery: string) {
return 'https://ru.wikipedia.org/w/api.php?action=opensearch&profile=strict&search='
+ searchQuery + '&limit=100&namespace=0&format=json&origin=*';
}
getUrlInformation(searchQuery: string) {
return 'https://ru.wikipedia.org/w/api.php?action=query&titles='
+ searchQuery + '&prop=info&format=json&origin=*';
}
showArticles() {
this.articlesServices.getArticles(this.getUrl(this.searchQuery))
.subscribe(
(data: Article) => this.articles = Object.values({ ...data })
);
}
showArticleInformation() {
this.articlesServices.getArticleInformation(this.getUrlInformation(this.searchQuery))
.subscribe(
(data: ArticleInformation) => this.articleInformation = { ...data }
);
console.log(this.articleInformation);
}
ngOnInit() {
}
}
articles.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { retry } from 'rxjs/operators';
export interface Article {
title: string;
collection: string[];
description: string[];
links: string[];
}
export interface ArticleInformation {
batchComplete: string;
query: {
pages: { }
};
}
@Injectable({
providedIn: 'root'
})
export class ArticlesService {
constructor(private http: HttpClient) { }
getArticles(url) {
return this.http.get<Article>(url)
.pipe(
retry(3),
);
}
getArticleInformation(url) {
return this.http.get<ArticleInformation>(url)
.pipe(
retry(3),
);
}
}
如果您确定 pages
将始终有一个 属性 而您只需要它 value
,您可以使用 Object.values
执行类似的操作:
const data = {
batchComplete: "",
query: {
pages: {
"9745": {
pageid: 9745,
length: 48,
lastrevid: 100,
contentmodel: "wikitext",
touched: "2019-02-01"
}
}
}
}
const articleInformation = {
...data,
query: {
pages: [Object.values(data.query.pages)[0]]
}
}
console.log(articleInformation)
但是,this.articleInformation
和 data
需要单独的 interface
,因为它们具有不同的结构。
像这样:
export interface ArticleInformationNew {
batchComplete: string;
query: {
pages: any[]
};
}