Решение Herer:
/**
* Tests two data structures for equality
* @param {object} x
* @param {object} y
* @returns {boolean}
*/
var equal = function(x, y) {
if (typeof x !== typeof y) return false;
if (x instanceof Array && y instanceof Array && x.length !== y.length) return false;
if (typeof x === 'object') {
for (var p in x) if (x.hasOwnProperty(p)) {
if (typeof x[p] === 'function' && typeof y[p] === 'function') continue;
if (x[p] instanceof Array && y[p] instanceof Array && x[p].length !== y[p].length) return false;
if (typeof x[p] !== typeof y[p]) return false;
if (typeof x[p] === 'object' && typeof y[p] === 'object') { if (!equal(x[p], y[p])) return false; } else
if (x[p] !== y[p]) return false;
}
} else return x === y;
return true;
};
Работает с любой вложенной структурой данных и, очевидно, игнорирует методы объектов. Даже не думайте о расширении Object.prototype с помощью этого метода, когда я это пробовал один раз, jQuery сломался;)
Для большинства массивов он все же быстрее, чем большинство решений для сериализации. Вероятно, это самый быстрый метод сравнения для массивов записей объектов.
Давайте запустимся с Аналога застежки-молнии для списков. Если требуется изменить энный элемент списка, он берет O (n), потому что необходимо скопировать n-1 первые элементы. Вместо этого можно сохранить список как структуру ((первые n-1 элементы инвертированный) энный элемент (остающийся элементами)). Например, список (1 2 3 4 5 6)
модифицируемый в 3 был бы представлен как ((2 1) 3 (4 5 6))
. Теперь, можно легко изменить 3 на что-то еще. Можно также легко переместиться, фокус уехал ((1) 2 (3 4 5 6))
и право ((3 2 1) 4 (5 6))
.
застежка-молния А является той же идеей, относился к деревьям. Вы представляете определенный фокус в дереве плюс контекст (до родителей, вниз детям), который дает Вам целое дерево в форме, где это является легко модифицируемым в фокусе, и легко переместить фокус вверх и вниз.
Вот очень хорошая статья, объясняя использование застежки-молнии для менеджера окон мозаичного размещения в Haskell. Статья Wikipedia не является хорошей ссылкой.
Короче говоря, застежка-молния является указателем или дескриптором к конкретному узлу в структуре списка или дереве. Застежка-молния уступает естественному дорогу из взятия древовидной структуры и обработки его, как будто дерево было "взято" сфокусированным узлом - в действительности, Вы получаете второе дерево, не требуя дополнительных копий, сделанных из исходного дерева или влияя на других пользователей дерева.
пример, данный шоу, как Вам отсортировало окна первоначально по местоположение на экране, и затем к образцовому фокусу, Вы используете застежку-молнию, указал на окно фокуса. Вы получаете хороший набор O (1) операции те, которые вставляют и удаляют, не имея необходимость к особому случаю окно фокуса или пишут дополнительный код.
Эта статья связана с Haskell, но она также объясняет застежки-молнии довольно хорошо, и это должно быть легко к краткому обзору от Haskell-специфических-особенностей.