如果我忽略它们在层次结构中的深度,如何为对象的字段赋值?

How to assign a value to a field of an object if I ignore their depth in the hierarchy?

假设我有这样一个对象:

obj = {
  a: {
    aa: 'aa',
    ab: 'ab',
    ac: {
      aca: 'aca',
      acb: 'acb'
    },
  b: 'b',
  set: function obj_set(field, value) {
    var route = field.split('.');
    ...
  }
}

而且,如您所见,我在此对象中有一个方法,您可以通过该方法为对象赋值。

obj.set('b', 'b2');
obj.set('a.ab', 'ab2');
obj.set('a.ac.acb', 'acb2');

因为我不知道作业的深度,所以我无法使用 this['b']this['a']['ab']this['a']['ac']['acb'] 来引用该字段。此外,在 JavaScript 中,当您将对象分配给变量时,它会被复制,并且您会丢失对原始对象的引用。那么,我不能这样做:

var reference = this;
for (i = 0, length = route.length; i < length; i++) {
  reference = reference[route[i]];
}
reference = value;

我该如何解决这个问题?谢谢。

您需要保存引用的最后一个键,因为最后一个引用可能是原始值而不是对象。

var obj = {
    a: {
        aa: 'aa',
        ab: 'ab',
        ac: {
            aca: 'aca',
            acb: 'acb'
        }
    },
    b: 'b',
    set: function (field, value) {
        var route = field.split('.'),
            key = route.pop();

        route.reduce(function (r, k) {
            r[k] = r[k] || {};
            return r[k];
        }, this)[key] = value;

    }
};
obj.set('b', 'b2');
obj.set('a.ac.acb', 'acb2');
document.write('<pre>' + JSON.stringify(obj, 0, 4) + '</pre>');