Цитата:
Цитата:
но раньше сутки были длиннее, да |
Цитата:
|
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, время: 01:20. |