Да, это легко. obj.prop = val
совпадает с obj['prop'] = val
, поэтому вы можете переписать setData следующим образом:
var setData = function (path, value) {
data[path] = value;
};
И это должно сделать.
Тем не менее, я не уверен, какой успех вы будете иметь с 3-м уровнем (если это имеет смысл.) Obj.prop.prop не может быть указан obj ['prop.prop'] и вместо этого придется на него должна ссылаться obj ['prop'] ['prop'], поэтому setData придется переписать, чтобы учесть это. Мне не очень повезло с этим, хотя.
Редактировать: Я сделал один, который (для меня) устанавливает его как вы хотите, но не дальше. К сожалению, если вы вкладываете глубже, чем ваши примеры, то я не вижу реальной причины отказаться от eval
. Я не делал никаких тестов, но в какой-то момент вычисления будут дороже в вычислительном отношении, чем даже eval
(что довольно сложно выполнить).
Это то, что я придумал, который установит их по крайней мере на 1 уровень; то есть он будет работать с key2.nested1
, но не с key2.nested1.i_love_nesting
, если это имеет смысл:
var setData = function (path, value) {
if (path.indexOf('.') != -1) {
path = path.split('.');
for (var i = 0, l = path.length; i < l; i++) {
if (typeof(data[path[i]]) === 'object') {
continue;
} else {
data[path[i - 1]][path[i]] = value;
}
}
} else {
data[path] = value;
}
};
Надеюсь, это поможет. Я мог бы написать это не самым эффективным способом, хотя ...