javascript - 是否有正确的方法将对象键名称映射到更可读的表示形式?

标签 javascript json angular typescript

我的服务器返回一个如下所示的对象:

{
   firstName: "Joe",
   lastName: "Smith",
   phoneNum: "212-222-2222"
}

我想使用 *ngFor 在 UI(内置于 Angular 2+ 中)中呈现此内容,但我不想使用现在的键名称。我想要一些更用户友好的东西,比如

First Name: Joe 
Last Name: Smith 
Phone Number: 212-222-2222

是否有一种“正确”的方法来提供从键名称到用户友好的键名称的映射?如果不是,我可能会做一些事情来确保键名称采用驼峰式大小写,然后在 UI 中使用函数将驼峰式大小写键名转换为间隔的用户友好名称。

但是,如果有人提出一个不涉及我在服务器端更改任何内容并在 UI 上进行映射的建议,那就太酷了

最佳答案

公开字段映射器的接口(interface)。

interface FieldMapper {
   firstName: string,
   lastName: string,
   phoneNumber: string,
}

interface LabeledField {
  label: string,
  value: string,
}

interface UserRenderable {
  firstname: LabeledField,
  lastname: LabeledField,
  phoneNumber: LabeledField,
}

在您的组件中使用它,例如

@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() {

    }
}

关于javascript - 是否有正确的方法将对象键名称映射到更可读的表示形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47805706/

相关文章:

Angular2 相对路线在守卫中导航

javascript - 如何使用 ko.mapping.fromJS 用来自 Ajax 调用的数据填充 observableArray?

javascript - HIghcharts.js addseries 不起作用?

javascript - 将方法作为 prop 传递给类静态函数

json - 如何使用 Express 从 Node.js 中的 url 获取 JSON 数据

iphone - 无法编译json-framework

javascript - 在 JavaScript 中,如何将一个对象数组与另一个对象数组合并?

javascript - 如何使用今天的日期预先填充 jQuery Datepicker 文本框?

Angular 将父组件的多个服务实例用于子组件

javascript - 在 Angular 8 项目中导入 leaftlet-control-geocoder?