Есть ли лучший способ использовать Ext.apply для объединения дочерних / подобъектов в другой объект? - PullRequest
4 голосов
/ 07 марта 2011

Я пытаюсь применить свойства объекта из objA к objB, но я понял, что Ext.apply имеет недостатки (или благословение?) Таким образом, что он применяет только объекты первого уровня вместе.

Пример:

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 ]

1 голос
/ 09 марта 2011

Вы можете изменить способ работы Ext.apply (), чтобы 4-й аргумент мог быть логическим, подразумевающим «глубокое» применение - это будет работать с вашим примером (глубокие значения по умолчанию - 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;
}; 
0 голосов
/ 08 марта 2011

Вы можете попробовать рекурсивное решение с несколькими особыми случаями, как показано ниже:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...