深度分配JavaScript对象文字

时间:2016-06-15 19:02:15

标签: javascript ecmascript-6

我正在尝试在对象中深度分配值。例如:

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

深层对象分配的优雅解决方案是什么?谢谢!

4 个答案:

答案 0 :(得分:0)

这是一种安全分配给深层对象的可读方式:

(((errors||{}).subCategory||{}).subSubCategory||{}).fieldWithError = 'Error Message'

如果它不存在, errors.subCategory.subSubCategory

答案 1 :(得分:0)

简短的回答,没有没有为它编写方法没有干净的方法(tbh你可以使用lodash中的方法而不导入整个库)

......但是......

警告这只是为了好玩。不要在生产中尝试这个(req es6)。

Object.prototype.chainSet = function() {
  let handler = {
    get (target, name) {
      if (!(name in target)) {
        target[name] = new Proxy({}, handler)
      }
      return target[name]
    }
  }

  return new Proxy(this, handler)
}

使用:

let a = {}
a.chainSet().foo.bar.baz = 1
a.foo.bar.baz // => 1

答案 2 :(得分:0)

Object.assign()可以很好地满足您的要求。

let errors = { otherField: "value" };
let newobj = {subCategory : {subSubCategory: {fieldWithError: "Error goes here"}}};
Object.assign(errors, newobj);

这会产生:

{
  otherField:'value',
  subCategory: {
    subSubCategory: {
      fieldWithError:'Error goes here'
    }
  }
}

答案 3 :(得分:0)

您可以尝试以下内容:

function ErrorRegistry(obj)
{
    this.errors = obj || {};
    this.addError = function(k, msg)
    {
        var keys = k.split('.');
        var o = this.errors;
        for(var i = 0, l = keys.length, last = l-1; i<l; i++)
        {
            if(typeof o[keys[i]] === 'undefined')
                o[keys[i]] = {};
            if(i == last)
                o[keys[i]] = msg;
            else
                o = o[keys[i]];
        }
    };
}
var errors = {'subCategory1':{'fieldWithError1':'Error1'}};
var errorRegistry = new ErrorRegistry(errors);
errorRegistry.addError('subCategory1.fieldWithError2', "Error2");
errorRegistry.addError('subCategory1.subSubCategory1.fieldWithError3', "Error3");
errorRegistry.addError('subCategory1.subSubCategory2.fieldWithError4', "Error4");
errors = errorRegistry.errors;
console.log(errors);
相关问题