最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析如何使用JavaScript輕松實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換

 更新時(shí)間:2024年10月24日 09:14:42   作者:Hamm  
這篇文章主要為大家詳細(xì)介紹了如何使用JavaScript輕松實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

之前寫了一篇 《TypeScript裝飾器之我們是這么處理項(xiàng)目數(shù)據(jù)轉(zhuǎn)換的》,有很多朋友私信和評論說,如果沒有 TypeScript裝飾器,純 JavaScript 有沒有什么好的數(shù)據(jù)轉(zhuǎn)換的方案呢?

很遺憾,還真有,雖然沒有 TypeScript 那么優(yōu)雅,但是也足夠好用。

這里用到了 Getter/Setter,以及 Object 原型鏈相關(guān)的知識。

一、假設(shè)需求

1. 后端返回的數(shù)據(jù)

這里我們先假設(shè)從后端來了個(gè) JSON 長這樣:

{
  id: 1,
  nickname: 'Hamm',
  age: 18,
  sex: 1,
  createTime: 1707021296000,
  bio: '一些廢話,前端不需要的字段'
}

其中,id createTime 是固定返回的公共屬性。

2. 前端類型聲明

基類

class BaseEntity {
  id;
  createTime;
}

用戶類

class User extends BaseEntity {
  nickname;
  age;
  sex;
}

3. 轉(zhuǎn)換要求

轉(zhuǎn)換到類時(shí)

  • createTime 轉(zhuǎn)為 Date類型;
  • 前端使用 gender 作為性別字段,且需要根據(jù) 1/0 顯示男女;
  • 前端沒有 bio 字段,需要過濾掉。

轉(zhuǎn)換到 JSON 時(shí)

  • createTime 轉(zhuǎn)回后端需要的時(shí)間戳
  • gender 還原回后段需要的 sex,并且轉(zhuǎn)換為 1/0

二、實(shí)現(xiàn)思路

正如我們之前有篇關(guān)于 幾個(gè)有關(guān)Getter/Setter的小故事 文章中提到,我們可以用 getter/setter 來攔截?cái)?shù)據(jù)達(dá)到轉(zhuǎn)換數(shù)據(jù)的目的:

1. 基于基類實(shí)現(xiàn) fromJson 靜態(tài)方法

class BaseEntity {
  id;
  createTime;

  static fromJson(json) {
    const user = new this();
    const filteredJson = Object.keys(json).reduce((item, key) => {
      if (user.hasOwnProperty(key)) {
        item[key] = json[key];
      }
      if (user.__proto__.hasOwnProperty(key)) {
        item[key] = json[key];
      }
      return item;
    }, {});
    const entity = Object.assign(user, filteredJson);
    if (entity.createTime) {
      entity.createTime = new Date(entity.createTime);
    }
    return entity;
  }
}

class UserEntity extends BaseEntity {
  nickname;
  age;
  gender;
  get sex() {
    return this.gender;
  }
  set sex(value) {
    if (value === undefined || value === null) {
      this.gender = undefined
    }else{
      this.gender = value === 1 ? '男' : '女';
    }
  }
}

const json = {
  id: 1,
  nickname: 'Hamm',
  age: 18,
  sex: 1,
  createTime: 1707021296000,
  bio: '一些廢話,前端不需要的字段'
}
console.log("json", json)
const user = UserEntity.fromJson(json)
console.log("entity", user)

其中,我們通過讀取 getter/setter 以及本身的屬性,來確定哪些是直接賦值,哪些是走set方法,哪些不存在的需要忽略。

2.調(diào)試輸出,美滋滋

json {
  id: 1,
  nickname: 'Hamm',
  age: 18,
  sex: 1,
  createTime: 1707021296000,
  bio: '一些廢話,前端不需要的字段'
}
entity UserEntity {
  id: 1,
  createTime: 2024-02-04T04:34:56.000Z,
  nickname: 'Hamm',
  age: 18,
  gender: '男'
}

3. 實(shí)現(xiàn)動(dòng)態(tài)方法的 toJson

接下來,我們需要將 BaseEntity 添加一個(gè) toJson 方法,用于將實(shí)體轉(zhuǎn)換為 JSON 格式,且給 UserEntitysex getter 做一下數(shù)據(jù)轉(zhuǎn)換:

class BaseEntity {
  id;
  createTime;

  static fromJson(json) {
    const user = new this();
    const filteredJson = Object.keys(json).reduce((item, key) => {
      if (user.hasOwnProperty(key)) {
        item[key] = json[key];
      }
      if (user.__proto__.hasOwnProperty(key)) {
        item[key] = json[key];
      }
      return item;
    }, {});
    const entity = Object.assign(user, filteredJson);
    if (entity.createTime) {
      entity.createTime = new Date(entity.createTime);
    }
    return entity;
  }

  toJson() {
    const proto = Object.getPrototypeOf(this);
    const ownProperties = Object.getOwnPropertyNames(this);
    const getters = Object.getOwnPropertyNames(proto).filter(key => {
      const descriptor = Object.getOwnPropertyDescriptor(proto, key);
      return descriptor && typeof descriptor.get === 'function';
    });
    const json = {}
    getters.forEach(key => {
      if (this.__proto__.hasOwnProperty(key)) {
        json[key] = this[key]
        this[key] = undefined
      }
    })
    ownProperties.forEach(key => {
      if (this.hasOwnProperty(key)) {
        json[key] = this[key]
        this[key] = undefined
      }
    })
    if (json.createTime && typeof json.createTime === 'object') {
      json.createTime = json.createTime.valueOf()
    } else {
      json.createTime = undefined
    }
    return JSON.parse(JSON.stringify(json))
  }
}

class UserEntity extends BaseEntity {
  nickname;
  age;
  gender;
  get sex() {
    if (this.gender === undefined || this.gender === null) {
      return undefined
    }
    return this.gender === '男' ? 1 : 0;
  }
  set sex(value) {
    if (value === undefined || value === null) {
      this.gender = undefined
    }else{
      this.gender = value === 1 ? '男' : '女';
    }
  }
}

const user = new UserEntity()
user.id = 1
user.nickname = "Hamm"
user.age = 18
user.gender = "男"
user.createTime = new Date()
console.log("entity", user)
console.log("json", user.toJson())

4. 繼續(xù)調(diào)試輸出,繼續(xù)美滋滋

entity UserEntity {
  id: 1,
  createTime: 2024-10-23T19:37:07.521Z,
  nickname: 'Hamm',
  age: 18,
  gender: '男'
}
json { sex: 1, id: 1, createTime: 1729712227521, nickname: 'Hamm', age: 18 }

三、完整代碼如下

class BaseEntity {
  id;
  createTime;

  static fromJson(json) {
    const user = new this();
    const filteredJson = Object.keys(json).reduce((item, key) => {
      if (user.hasOwnProperty(key)) {
        item[key] = json[key];
      }
      if (user.__proto__.hasOwnProperty(key)) {
        item[key] = json[key];
      }
      return item;
    }, {});
    const entity = Object.assign(user, filteredJson);
    if (entity.createTime) {
      entity.createTime = new Date(entity.createTime);
    }
    return entity;
  }

  toJson() {
    const proto = Object.getPrototypeOf(this);
    const ownProperties = Object.getOwnPropertyNames(this);
    const getters = Object.getOwnPropertyNames(proto).filter(key => {
      const descriptor = Object.getOwnPropertyDescriptor(proto, key);
      return descriptor && typeof descriptor.get === 'function';
    });
    const json = {}
    getters.forEach(key => {
      if (this.__proto__.hasOwnProperty(key)) {
        json[key] = this[key]
        this[key] = undefined
      }
    })
    ownProperties.forEach(key => {
      if (this.hasOwnProperty(key)) {
        json[key] = this[key]
        this[key] = undefined
      }
    })
    if (json.createTime && typeof json.createTime === 'object') {
      json.createTime = json.createTime.valueOf()
    } else {
      json.createTime = undefined
    }
    return JSON.parse(JSON.stringify(json))
  }
}

class UserEntity extends BaseEntity {
  nickname;
  age;
  gender;
  get sex() {
    if (this.gender === undefined || this.gender === null) {
      return undefined
    }
    return this.gender === '男' ? 1 : 0;
  }
  set sex(value) {
    if (value === undefined || value === null) {
      this.gender = undefined
    }else{
      this.gender = value === 1 ? '男' : '女';
    }
  }
}

const json = {
  id: 1,
  nickname: 'Hamm',
  age: 18,
  sex: 1,
  createTime: 1707021296000,
  bio: '一些廢話,前端不需要的字段'
}
console.log("json",json)
const user = UserEntity.fromJson(json)
console.log("entity", user)
console.log("json", user.toJson())

四、總結(jié)

如上代碼,我們利用了 getter/setter 以及 Object 原型鏈上的一些方法來完成了轉(zhuǎn)換。

雖然稍顯麻煩,但也算解決了不在外部寫一些方法來轉(zhuǎn)換。

各有所長,實(shí)現(xiàn)的方式有很多種,但思路才是很好玩的東西。

當(dāng)然,JavaScript的裝飾器提案已經(jīng)快發(fā)布了,后續(xù)我們將繼續(xù)摸索用裝飾器在JavaScript中實(shí)現(xiàn)類似功能。(TypeScript的裝飾器我們敢用,是因?yàn)榫幾g后的JS代碼沒有包含裝飾器的部分,在瀏覽器上不會(huì)有問題。)

到此這篇關(guān)于淺析如何使用JavaScript輕松實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)JavaScript數(shù)據(jù)轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

根河市| 望江县| 清水河县| 叶城县| 宜宾县| 九龙县| 福泉市| 昌都县| 灵丘县| 仪陇县| 启东市| 寿阳县| 达州市| 广昌县| 拉萨市| 安化县| 东乡| 涿州市| 木兰县| 明光市| 承德县| 克什克腾旗| 醴陵市| 应城市| 裕民县| 宝鸡市| 石林| 米脂县| 忻州市| 九龙坡区| 库伦旗| 巴南区| 阿鲁科尔沁旗| 郎溪县| 泗阳县| 新安县| 通化县| 榆中县| 方正县| 六盘水市| 灯塔市|