Есть ли лучший способ использовать Ext.применить для объединения дочерних / подобъектов в другой объект?
Я пытаюсь применить свойства объекта из objA в objB, но я понял Ext.применять ущербно (или благословенно?) таким образом, что он применяет только объекты первого уровня вместе.
Пример:
var objA = {
name: 'objA',
baseParams: {
cols: [1,2,3,4,5]
}
};
//used in subclass
var objB = {
name: 'objB',
baseParams: {
limit: 50,
sort: 'name'
}
};
//used in baseclass
var objC = {
name: 'objC',
baseParams: {
as_hash: true,
limit: 20
}
};
Ext.apply(objB,objA); //used in subclass
Ext.apply(objC,objB); //used in baseclass
Пример выведет:
obj = {
name: 'objA',
baseParams: {
cols: [1,2,3,4,5]
}
};
Мне бы хотелось, чтобы вместо этого (ожидаемый результат):
obj = {
name: 'objA',
baseParams: {
cols: [1,2,3,4,5],
as_hash: true,
limit: 50,
sort: 'name'
}
};
Как я могу достичь этого, не делая этого?
// subclass:
var bpTemp = {};
bpTemp.baseParams = Ext.apply(objB.baseParams, objA.baseParams);
Ext.apply(objB,objA);
Ext.apply(objB,bpTemp);
// base class:
var bpTemp = {};
bpTemp.baseParams = Ext.apply(objC.baseParams, objB.baseParams);
Ext.apply(objC,objB);
Ext.apply(objC,bpTemp);
2 ответа:
Вы можете изменить способ Ext.apply() работает так, что 4-й аргумент может быть логическим, подразумевающим" deep " apply - это будет работать с вашим примером (deep по умолчанию true):
Ext.apply = function(o, c, defaults, deep){ deep = deep!==false; // no "this" reference for friendly out of scope calls if(defaults){ Ext.apply(o, defaults); } if(o && c && typeof c == 'object'){ for(var p in c){ o[p] = (deep && Ext.isObject(o[p]) && Ext.isObject(c[p])) ? Ext.apply(o[p], c[p]) : c[p]; } } return o; };
Вы можете попробовать рекурсивное решение, с несколькими частными случаями, как показано ниже:
function deepApply(receiver, config, defaults) { if (defaults) { deepApply(receiver, defaults); } if (receiver && config && typeof config == 'object') { for (var p in config) { if (typeof config[p] != 'object' || Ext.isArray(config[p])) { receiver[p] = config[p]; } else { if (typeof receiver[p] != 'object') { receiver[p] = {}; } deepApply(receiver[p], config[p]); } } } return receiver; }