【发布时间】:2016-06-15 19:02:15
【问题描述】:
我正在尝试在对象中深入分配一个值。例如:
const errors = {}
if(errorOnSpecificField) {
// TypeError: Cannot read property 'subSubCategory' of undefined(…)
errors.subCategory.subSubCategory.fieldWithError = 'Error Message'
}
现在,没有 lodash,我可以做到:
const errors = {}
if(errorOnSpecificField) {
errors.subCategory = errors.SubCategory || {}
errors.subCategory.subSubCategory = errors.SubCategory.subSubCategory || {}
errors.subCategory.subSubCategory.fieldWithError = 'Error Message'
}
使用 lodash,我可以做到这一点:
const errors = {}
if(errorOnSpecificField) {
_.set(errors, 'subCategory.subSubCategory.fieldWithError', 'Error Message');
}
我试图避免使用第三方库。有没有更优雅的解决方案,尤其是现在 es2015 有对象解构。逆运算很简单:
let {subCategory : {subSubCategory: {fieldWithError}}} = errors
什么是深度对象分配的优雅解决方案?谢谢!
【问题讨论】:
-
Object.assign() ? - 它会覆盖所有属性
-
正如你所提到的,因为它覆盖了已经设置的其他属性,所以这不适用于我的情况
-
然后您可能会寻找许多
extend实现中的一些实现 -
呃,为什么不直接使用
errors.subCategory = {subSubCategory: {fieldWithError: 'Error Message'}}?这与解构完全相反。 -
问题是如果我已经定义了其他 subSubCategories,它会覆盖它们