一切正常,直到到达第二次接触为止。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);
1 回答

扬帆大鱼
TA贡献1799条经验 获得超9个赞
您正在递归地格式化数据,但始终尝试从中更改突变的数据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));
添加回答
举报
0/150
提交
取消