jQuery глубокое копирование с Ext JS? - PullRequest
8 голосов
/ 17 марта 2011

Я попробовал и удивился, как я не мог сделать с ExtJS.Позвольте мне объяснить с помощью блока кода.

В jQuery

console.clear();
var a = {
    b: 5,
    c: 4,
    o: {
        l: 2,
        p: 2
    }
}

var b = {
    k: 4,
    l: 3,
    c: 5,
    o: {
        m: 2,
        l: 1
    }
}

var ex = $.extend(true, a, b);
console.dir(ex)

Вот вывод

ex = {
    a: {
        q: 2
    },
    b: 5,
    c: 5,
    o: {
        l: 1,
        p: 2,
        m: 2
    }
}

Ext apply, applyIf, copyTo не работает так.Как я могу произвести вывод в ExtJS?

Заранее спасибо.

Ответы [ 3 ]

10 голосов
/ 17 апреля 2012

Для недавнего проекта мы адаптировали этот пример кода для получения следующего метода:

Ext.deepCopy = function(p, c) {
    c = c || (p.constructor === Array ? [] : {});
    for (var i in p) {
        if (typeof p[i] === 'object' && p[i] !== null) {
            c[i] = p[i].constructor === Array ? [] : {};
            Ext.deepCopy(p[i], c[i]);
        } else {
            c[i] = p[i];
        }
    }
    return c;
};
5 голосов
/ 17 марта 2011

Глубокое копирование не поддерживается в Ext.Есть Ext.apply и Ext.applyIf, но они оба работают только на первом уровне хэш-карты и будут переопределять, а не объединять любые встроенные массивы или хэши.

На самом деле, документы явно указывают, что Ext.applyпредназначен для работы с объектами конфигурации, но не для того, чтобы это имело значение, а просто для иллюстрации того, что он не предназначен для использования в качестве функции утилиты слияния, хотя в принципе это возможно, если вы хотите объединить только первый уровень / глубину.

3 голосов
/ 19 июля 2014

Используйте метод Ext.Object.merge () , который делает именно то, что вы ищете.

...