前不久在参加面试的时候遇到了这样一道题,"写一个根据id字段查找记录的缓存函数,如果之前查过,则直接返回之前查找过的对象,而无须重新查找"。当时由于时间较短加上时间比较紧张,考虑并不是特别全,并没有写出一个比较合适的方法(无法普及调用)。今天回过头想了一下,做了一些改进,望大家多给与指点。思路上采用闭包和数组的find方法。
var getItem=function () { var cacheArr=[]; //判断数组是否支持find方法,如果不支持则扩充 if (!Array.prototype.find) { Array.prototype.find = function(predicate) { if (this === null) { throw new TypeError(‘Array.prototype.find called on null or undefined‘); } if (typeof predicate !== ‘function‘) { throw new TypeError(‘predicate must be a function‘); } var list = Object(this); var length = list.length >>> 0; var thisArg = arguments[1]; var value; for (var i = 0; i < length; i++) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return value; } } return undefined; }; } getItemById= function(id,arr){ var temp=cacheArr.find(function (item) {return item.id==id}) if(temp==undefined){ var newItem=arr.find(function (item) {return item.id==id}); cacheArr.push(newItem); console.log("New Data") return newItem; }else{ console.log("Cache Data") return temp; } }; return getItemById; } Array.prototype.getItemById=function(id){ return getItem().call([],id,this); }
测试对象及使用方法:
var scoresTable=[ {id:11,name:"小张",score:80}, {id:22,name:"小王",score:95}, {id:33,name:"小李",score:50}, {id:44,name:"小刘",score:65}, {id:55,name:"小徐",score:84} ] //模块初始化使用 console.log(scoresTable.getItemById(11)) console.log(getItemById(11,scoresTable)); //模块初始化使用 console.log(scoresTable.getItemById(22)); console.log(getItemById(11,scoresTable)); console.log(getItemById(22,scoresTable)); console.log(getItemById(11,scoresTable));
执行结果如下:
时间: 2024-11-04 14:47:48