Не найден ресурс HTTP, соответствующий URI запроса. На контроллере 'x', соответствующем запросу, не найдено никаких действий. "}

Просто сделайте

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);
0
задан Mustafa 16 January 2019 в 11:51
поделиться