簡體   English   中英

帶數組的ES6類默認值

[英]ES6 class default value with array

一切正常,直到到達第二次接觸為止。

TypeError: Cannot set property 'name' of undefined

因為構造函數中的默認聯系人只有1次出現。 有什么解決方法嗎?

class Cust {
  constructor(custData) {

    this.address = {
      countryCode: null,
      address1: null,
      address2: null,
      city: null,
      countrySubDivision: null,
      postalCode: null
    },
    this.groupId = null;
    this.contact = [{ name: null, phone: null }];  
    //this.contact.phone = custData.contact.phone    
    this.state = this._getState(custData.status || null);

    this._setData(custData);
  }

  _getState(status) {
    let state = (status == 'active' ? 'good' : 'bad');
    return state;
  }
  _setData(data, prefix, index) {
    let result;
    for (let key in data) {
      let value = data[key];
      let valueIsNullOrEmpty = !value;
      if (!valueIsNullOrEmpty && typeof value === 'object') {
        if (Array.isArray(value)) {
          value = value
            .map((subProperty, index) => this._setData(subProperty, key, index))
            .filter((subProperty) => Object.keys(subProperty).length > 0);
          valueIsNullOrEmpty = value.length === 0;
          continue;
        } else {
          value = this._setData(value, key);
          valueIsNullOrEmpty = Object.keys(value).length === 0;
          continue;
        }
      }
      if (prefix) {
        if (index >= 0) {
          this[prefix][index][key] = data[key];
        }
        else {
          this[prefix][key] = data[key];
        }
      }
      else {
        this[key] = data[key]
      }
      result = data[key];

    }
    console.log(JSON.stringify(this));
    return result;
  }
}

var custData = {
  id: 1,
  name: "Barr",
  //  groupId: 2,
  status: "active",
  address: {
    countryCode: "USA",
    address1: "123 main street",
    address2: null,
    city: "Chicago",
    postalCode: "85001"
  }, contact: [
    {
      phone: "222-222-2222"
    },
    {
      name: "Tim"
    }]
}
var cust = new Cust(custData);

您正在遞歸格式化數據,但始終嘗試從this更改突變數據,例如

  this[key]

這將適用於深度1,但如果深度為5,則變得很復雜:

 this[key1][key2][key3][key4][key5]

您明白了這一點(這就是您的代碼實際失敗的地方,訪問了深度大於2的嵌套對象的屬性)。

this永遠都行不通。 而是將要修改的對象傳遞方法中(然后可以是函數),還可以通過返回新對象(使調試更加容易)來使其保持不變。

 function format(obj) {
    const result = {};
   //...
   return result;
 }

然后,您可以輕松地使用嵌套對象調用format 從類內部可以稱為:

  Object.assign(this, format(data));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM