Просто сделайте
record['foo.bar.baz'] = 99;
Но как это будет работать? Это строго для приключений с окружающей средой V8 (гармония Chrome или Node), используя Object.observe
. Мы наблюдаем объект и фиксируем добавление новых свойств. Когда «свойство» foo.bar.baz
добавляется (через назначение), мы обнаруживаем, что это свойство с точками и преобразуем его в присваивание record['foo']['bar.baz']
(создавая record['foo']
, если он не существует), что в свою очередь преобразуется в присвоение record['foo']['bar']['baz']
. Это происходит следующим образом:
function enable_dot_assignments(changes) {
// Iterate over changes
changes.forEach(function(change) {
// Deconstruct change record.
var object = change.object;
var type = change.type;
var name = change.name;
// Handle only 'add' type changes
if (type !== 'add') return;
// Break the property into segments, and get first one.
var segments = name.split('.');
var first_segment = segments.shift();
// Skip non-dotted property.
if (!segments.length) return;
// If the property doesn't exist, create it as object.
if (!(first_segment in object)) object[first_segment] = {};
var subobject = object[first_segment];
// Ensure subobject also enables dot assignments.
Object.observe(subobject, enable_dot_assignments);
// Set value on subobject using remainder of dot path.
subobject[segments.join('.')] = object[name];
// Make subobject assignments synchronous.
Object.deliverChangeRecords(enable_dot_assignments);
// We don't need the 'a.b' property on the object.
delete object[name];
});
}
Теперь вы можете просто сделать
Object.observe(record, enable_dot_assignments);
record['foo.bar.baz'] = 99;
. Остерегайтесь, однако, что такие назначения будут асинхронными, что может или не может работать для вас. Чтобы решить эту проблему, вызовите Object.deliverChangeRecords
сразу после назначения. Или, хотя это не так синтаксически приятно, вы могли бы написать вспомогательную функцию, а также настроить наблюдателя:
function dot_assignment(object, path, value) {
Object.observe(object, enable_dot_assignments);
object[path] = value;
Object.deliverChangeRecords(enable_dot_assignments);
}
dot_assignment(record, 'foo.bar.baz', 99);