如果我忽略它们在层次结构中的深度,如何为对象的字段赋值?
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>');
假设我有这样一个对象:
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>');