JavaScript中编写函数向const声明对象新增嵌套对象及属性的问题
问题解法
你之前的代码逻辑错误点很明确:所有赋值操作都直接作用在phonebook顶层对象上,没有定位到对应姓名的嵌套联系人对象,才会把号码类型字段堆到根层级。
正确实现代码
直接在函数里写如下逻辑即可,同时兼容「新增全新联系人」和「给已有联系人追加新号码」两种场景,不会覆盖已有联系人的旧号码数据:
const phonebook = { "Lily": { mobile: "+16235554420", work: "+12445552374", home: "+19775552223" }, "Kyle, el hermano de Tim": { mobile: "+4235555616" } }; function addPhoneNumber(name, numberType, number) { // 如果联系人不存在,先初始化空的联系人对象,避免读取报错 if (!phonebook[name]) { phonebook[name] = {}; } // 给对应联系人的嵌套对象挂载号码属性 phonebook[name][numberType] = number; } // 测试调用 addPhoneNumber("Stephanie Noland", "mobile", "+4235555212"); console.log(phonebook["Stephanie Noland"].mobile); // 正常输出 "+4235555212"
逻辑说明
- 用
const声明对象不影响内部属性修改:const仅限制变量不能被重新赋值(比如phonebook = []这类写法会抛错),新增、修改对象的嵌套属性完全合法。 - 动态属性赋值要顺着层级走:先通过
phonebook[name]定位到具体联系人的子对象,再给这个子对象的numberType动态属性赋值,就不会出现属性挂到顶层的问题。 - 增加存在性判断是为了避免覆盖:如果要给已存在的联系人加新号码(比如给Lily加fax传真号),不会清空该联系人之前存的mobile、work等号码。
你之前错误写法生成的异常结构,本质就是少了一层对象定位,相当于给整个电话本直接加了mobile、work这类属性,而不是给某个联系人加。
内容的提问来源于stack exchange,提问作者AegisNull
相关产品推荐
相关产品推荐

