Определите методы get и set для Object
. На самом деле его можно определить только для объекта dashboard
и только для его потомков, но это легко сделать.
Object.prototype.get = function(prop) {
this[prop] = this[prop] || {};
return this[prop];
};
Object.prototype.set = function(prop, value) {
this[prop] = value;
}
Выполните итерацию по вложенным свойствам, используя этот метод get()
, и вызывайте set()
всякий раз, когда необходимо установить значение.
var dashboard = {};
dashboard.get('pages').get('user').set('settings', 'oh crap');
// could also set settings directly without using set()
dashboard.get('pages').get('user').settings = 'oh crap';
console.log(dashboard); // {pages: {user: {settings: "oh crap"}}};
Вы также можете расширить / изменить метод get
для принятия вложенных свойств в качестве отдельных аргументов или массива или строки. Используя это, вам нужно будет вызвать get только один раз:
// get accepts multiple arguments here
dashboard.get('pages', 'user').set('settings', 'something');
// get accepts an array here
dashboard.get(['pages', 'user']).set('settings', 'something');
// no reason why get can't also accept dotted parameters
// note: you don't have to call set(), could directly add the property
dashboard.get('pages.user').settings = 'something';
Обновление
Поскольку метод get обычно возвращает объект и не знает, нужен ли вам массив или какой-либо другой тип объекта, вам придется указать это самим:
dashboard.get('pages.user').settings = [];
Тогда вы можете выдвинуть элементы в массив настроек как
dashboard.get('pages.user').settings.push('something');
dashboard.get('pages.user').settings.push('something else');
Чтобы на самом деле функция get создала иерархию объектов из заданной строки, такой как pages.user, вам нужно разбить строку на части и проверить, существует ли каждый вложенный объект. Вот модифицированная версия get
, которая делает именно это:
Object.prototype.get = function(prop) {
var parts = prop.split('.');
var obj = this;
for(var i = 0; i < parts.length; i++) {
var p = parts[i];
if(obj[p] === undefined) {
obj[p] = {};
}
obj = obj[p];
}
return obj;
}
// example use
var user = dashboard.get('pages.user');
user.settings = [];
user.settings.push('something');
user.settings.push('else');
console.log(dashboard); // {pages: {user: {settings: ["something", "else"] }}}
// can also add to settings directly
dashboard.get('pages.user.settings').push('etc');