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

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

本文关键字:对象 赋值 深度 字段 层次结构 如果      更新时间:2023-09-26

假设我有一个这样的对象:

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>');