使用場景
- 當一些計算結果可以保留下來為以后的運算提供方便的時候碰镜, 就可以用到記憶話函數(shù)
- 記憶化函數(shù)將計算結果存儲起來,如果之后碰到相同的參數(shù),就直接放回已經(jīng)計算過的參數(shù)
代碼
- 記憶函數(shù)
function memorize(func) {
var cache = {};
return function() {
//讓參數(shù)長度與參數(shù)拼接成字符串琼懊,例如1,2 -> 212,形成唯一的key值
var key = arguments.length + Array.prototype.join.call(arguments);
if (cache[key]) {
return cache[key];
} else {
console.log(arguments)
cache[key] = func.apply(this, arguments);
return cache[key];
}
};
}
- 去重
function deepCopy(o) {
let newObj = o instanceof Array ? [] : {};
for (var prop in o) {
if (typeof o[prop] == "object") {
newObj[prop] = deepCopy(o[prop]);
} else {
newObj[prop] = o[prop];
}
}
return newObj;
}
- 對比運行時間
var list = [
{
id: "1",
menu_name: "設置",
menu_url: "setting",
parent_id: 0
},
{
id: "1-1",
menu_name: "權限設置",
menu_url: "setting.permission",
parent_id: "1"
},
{
id: "1-1-1",
menu_name: "用戶管理列表",
menu_url: "setting.permission.user_list",
parent_id: "1-1"
},
{
id: "1-1-2",
menu_name: "用戶管理新增",
menu_url: "setting.permission.user_add",
parent_id: "1-1"
},
{
id: "1-2",
menu_name: "菜單設置",
menu_url: "setting.menu",
parent_id: "1"
},
{
id: "1-2-1",
menu_name: "菜單列表",
menu_url: "setting.menu.menu_list",
parent_id: "1-2"
}
];
var memorizeFunc = memorize(deepCopy);
// console.log()
console.time("pre");
console.log(deepCopy(list));
console.timeEnd("pre"); // 3.162841796875ms
console.time("mem");
console.log(memorizeFunc(list));
console.timeEnd("mem");
-
節(jié)省了2ms
image.png