Резюме: Есть ли более быстрый способ для хэш-объектов, чем JSON.stringify
?Эффективное запоминание аргументов объекта
Подробности: У меня есть библиотека Ruby и JavaScript (NeatJSON), которая обеспечивает довольно-типографию значений JavaScript. Недавно я исправил проблему, когда глубоко вложенные объекты вызывают производительность O (n!) (n - уровень вложенности) с использованием memoization на основе сериализуемого объекта и суммы отступа.
В Ruby, the fix было очень легко, потому что вы можете индексировать хэшей массивов уникальных наборов объектов:
build = ->(object,indent) do
memoizer[[object,indent]] ||= <all the rest of the code>
end
В JavaScript, однако, я не могу индекс объекта другим объектом (в уникальный способ). Вслед за несколько статей, которые я нашел в Интернете, я решил fix the problem обобщенно, используя JSON.stringify
на полном наборе аргументов функции, чтобы создать уникальный ключ для запоминания:
function memoize(f){
var memo = {};
var slice = Array.prototype.slice;
return function(){
var args = slice.call(arguments);
var mkey = JSON.stringify(args);
if (!(mkey in memo)) memo[mkey] = f.apply(this,args);
return memo[mkey];
}
}
function rawBuild(o,indent){ .. }
var build = memoize(rawBuild);
Это работает, но (а) это немного медленнее, чем мне хотелось бы, и (б) кажется дико неэффективным (и неэлегантным) выполнять (наивную) сериализацию каждого объекта и ценности, которые я собираюсь сериализовать. Акт сериализации большого объекта со многими значениями будет хранить строку и результат форматирования для КАЖДОГО уникального значения (а не только значений листа) всего объекта.
Есть ли современный трюк JavaScript, который позволил бы мне однозначно идентифицировать ценность? Например, какой-то способ доступа к внутреннему идентификатору или связывание сложных объектов с уникальными целыми числами, которые принимают O (1) раз, чтобы найти идентификатор для значения?
Очень похоже (не совсем ДУП) из [JavaScript Id объекта] (http://stackoverflow.com/q/2020670/405017). Не совсем дуп, потому что мне нужно найти уникальное представление для большинства видов значений (string, boolean, number, array, object), а не только для объектов. – Phrogz
Хотите ли вы мемуазировать по стоимости объекта или ссылке? Другими словами: 'var a = {b: 1}; var c = memoizedFn (a); a.b = 2; var d = memoizedFn (a); 'должен ли второй вызов использовать memoized значение? –
@TamasHegedus По ссылке вполне достаточно. – Phrogz