Цитата:
Цитата:
но раньше сутки были длиннее, да |
Цитата:
|
krutoy, припекло тебя :D
Цитата:
Я показал свою реализацию, которой мне хватает более чем. Да, у нее есть ограничения. Если тот, кто ее использует не способен их увидеть - это его проблемы) Цитата:
|
Цитата:
|
вот оно че, Михалыч
комментарии излишни) |
Цитата:
в моём последнем примере как раз так и делается, с учётом того, что ссылку сохранить не проблема, а сохранение состояния можно реализовывать с различной степенью сложности |
bes,
Не взрывай мне мозг :) function f(obj) { return obj.a + obj.b; } function isSame(args1, args2) { var len1 = args1.length; var len2 = args2.length; if ( len1 != len2 ) return false; for (var i = 0; i < len1; i++) { if ( args1[i] === args2[i] ) continue; return false; } return true; } function cacheFn(fn) { var cache = []; return function () { var len = cache.length; for (var i = 0; i < len; i++) { if ( isSame(cache[i].args, arguments) && JSON.stringify(arguments) == cache[i].strArg) { console.log("cache: " + cache[i].res + "\n\n"); return cache[i].res; } } cache.push( {args: arguments, strArg: JSON.stringify(arguments), res: fn.apply(this, arguments)} ); console.log("call: " + cache[len].res + "\n\n") return cache[len].res; } } var cacheF = cacheFn(f); o={b: 2} var o1 = Object.create(o) o1.a = 1 cacheF(o1); o.b=10 console.log("----"); cacheF(o1); console.log("****"); cacheF(o1); // call: 3 // // // ---- // cache: 3 // // // **** // cache: 3 |
Цитата:
ещё куча непокрытого, но твой случай покрывает :) function type(el) { var type = typeof el; if ( type != "object" ) return type; if ( el == null ) return "null"; if ( el.length || el.length >= 0 ) return "array"; return "object"; } function len(obj) { var n = 0; for (var key in obj) { n++; } return n; } function isEqual(obj1, obj2) { if ( type(obj1) != "object" && type(obj2) != "object" ) return obj1 == obj2; if ( len(obj1) != len(obj2) ) return false; for (var key in obj1) { if (obj1[key] === obj2[key]) { continue; } return false; } return true; } function cloneObject(obj) { var clone = {}; for (var key in obj) { clone[key] = obj[key]; } return clone; } function isSame(args1, args2) { var len1 = args1.length; var len2 = args2.length; if ( len1 != len2 ) return false; for (var i = 0; i < len1; i++) { if ( isEqual(args1[i], args2[i]) ) continue; return false; } return true; } function giblets(args) { var giblet = []; var length = args.length; for ( var i = 0; i < length; i++ ) { if ( type(args[i]) != "object" ) { giblet.push(args[i]); } else { giblet.push( cloneObject(args[i]) ); } } return giblet; } function cacheFn(fn) { var cache = []; return function () { var len = cache.length; for (var i = 0; i < len; i++) { if ( isSame(cache[i].args, giblets(arguments)) ) { console.log("cache: " + cache[i].res + "\n\n"); return cache[i].res; } } cache.push( {args: giblets(arguments), res: fn.apply(this, arguments)} ); console.log("call: " + cache[len].res + "\n\n") return cache[len].res; } } function f(obj) { return obj.a + obj.b; } var cacheF = cacheFn(f); o={b: 2} var o1 = Object.create(o) o1.a = 1 cacheF(o1); cacheF(o1); o.b=10 console.log("----"); cacheF(o1); cacheF(o1); |
krutoy,
function isSame(args1, args2) { var len1 = args1.length; var len2 = args2.length; if ( len1 != len2 ) return false; for (var i = 0; i < len1; i++) { if ( args1[i] === args2[i] ) continue; return false; } return true; } и function isSame(args1, args2) { return args1 === args2; } Это напомнило мне прошлую неделю. Задание было переписать самописный ACl в самописном движке. Час я смотрел на этот код и не мог понять, что здесь было написано. Я хотел понять мысль того разработчика который это написал. Это был запрос на пол-страницы , пришлось и по гуглить так как некоторые операторы я встретил впервые, а также много рекурсивных функций. Копаться в этом дерьме не было особого интереса. Решение было интересное. Пару проведенных тестов подача одних параметров на вход привело к очевидности к замене 300 строк кода 3 строками. Тестировщик позже подтвердил правильность решения. В общем к чему я. Приведенный в начале топика код напоминает напоминает шаблон Реестр (Registry) |
Poznakomlus,
Да, но ваша ассоциация, кстати, не совсем к месту:). Все таки "выяснить, указывают ли 2 ссылки на один и тот же объект(массив)" и "имеют ли 2 объекта (массива) идентичную структуру" это далеко не одно и то же. |
Часовой пояс GMT +3, время: 10:36. |