javascript - Finns det ett korrekt sätt att kartlägga objektnyckelnamn till mer läsbara representationer?
Min server returnerar ett objekt som ser ut så här:
{
firstName: "Joe",
lastName: "Smith",
phoneNum: "212-222-2222"
}
Jag vill presentera detta i UI:t (byggt i Angular 2+) med *ngFor men jag vill inte använda nyckelnamnen som de är nu. Jag vill ha något mer användarvänligt, som
First Name: Joe
Last Name: Smith
Phone Number: 212-222-2222
Finns det ett "korrekt" sätt att tillhandahålla en mappning från nyckelnamn till användarvänliga nyckelnamn? Om inte skulle jag förmodligen bara göra något för att säkerställa att nyckelnamn är i camel case och sedan i användargränssnittet använda en funktion för att konvertera camel case-nyckelnamn till mellanrumsersättnings användarvänliga namn.
Men det skulle vara coolt om någon hade ett förslag som inte innebar att jag ändrade något på serversidan, och gjorde en mappning på användargränssnittet
Svar #1
Exponera ett gränssnitt för en fältskarta.
interface FieldMapper {
firstName: string,
lastName: string,
phoneNumber: string,
}
interface LabeledField {
label: string,
value: string,
}
interface UserRenderable {
firstname: LabeledField,
lastname: LabeledField,
phoneNumber: LabeledField,
}
Använd detta i din komponent, t.ex.
@Component({
...
template: `
<ul>
<li *ngFor="#user of users">{{user.firstname.label}}
{{user.firstname.value}}</li>
<ul>
`
})
export class Users {
users: Array<UserRenderable>
fieldMapper: FieldMapper = {
firstName: 'First Name',
lastName: 'Last Name',
phoneNumber: 'Phone Number'
}
constructor(private userService : UserService) {
const users = userService.get();
this.users = users.map((u) => (
Object.keys(
this.fieldMapper
)
.reduce(
(prev, currKey) => {
prev[currKey] = {
label: this.fieldMapper[k],
value: u[k]
}
return prev;
}, {})
));
}
ngOnInit() {
}
}
Svar #2
Du kan hålla en mappning av nycklar till läsbara etiketter och omvandla svaret till objekt med etikett/värde.
Dessa objekt kan användas i ngFor för att visa etikett och värde.
const response = {
firstName: "Joe",
lastName: "Smith",
phoneNum: "212-222-2222"
};
const labels = {
firstName: "First Name",
lastName: "Last Name",
phoneNum: "Phone Number",
address: "Address"
}
const result = Object.keys(response).map(key => ({label: labels[key], value: response[key]}));
console.log(result);