前不久在参加面试的时候遇到了这样一道题,"写一个根据id字段查找记录的缓存函数,如果之前查过,则直接返回之前查找过的对象,而无须重新查找"。当时由于时间较短加上时间比较紧张,考虑并不是特别全,并没有写出一个比较合适的方法(无法普及调用)。今天回过头想了一下,做了一些改进,望大家多给与指点。思路上采用闭包和数组的find方法。

  1. var getItem=function () {
  2. var cacheArr=[];
  3.  
  4. //判断数组是否支持find方法,如果不支持则扩充
  5. if (!Array.prototype.find) {
  6. Array.prototype.find = function(predicate) {
  7. if (this === null) {
  8. throw new TypeError('Array.prototype.find called on null or undefined');
  9. }
  10. if (typeof predicate !== 'function') {
  11. throw new TypeError('predicate must be a function');
  12. }
  13. var list = Object(this);
  14. var length = list.length >>> 0;
  15. var thisArg = arguments[1];
  16. var value;
  17.  
  18. for (var i = 0; i < length; i++) {
  19. value = list[i];
  20. if (predicate.call(thisArg, value, i, list)) {
  21. return value;
  22. }
  23. }
  24. return undefined;
  25. };
  26. }
  27.  
  28. getItemById= function(id,arr){
  29. var temp=cacheArr.find(function (item) {return item.id==id})
  30. if(temp==undefined){
  31. var newItem=arr.find(function (item) {return item.id==id});
  32. cacheArr.push(newItem);
  33. console.log("New Data")
  34. return newItem;
  35. }else{
  36. console.log("Cache Data")
  37. return temp;
  38. }
  39. };
  40. return getItemById;
  41. }
  42.  
  43. Array.prototype.getItemById=function(id){
  44. return getItem().call([],id,this);
  45. }

测试对象及使用方法:

  1. var scoresTable=[
  2. {id:11,name:"小张",score:80},
  3. {id:22,name:"小王",score:95},
  4. {id:33,name:"小李",score:50},
  5. {id:44,name:"小刘",score:65},
  6. {id:55,name:"小徐",score:84}
  7. ]
  8.  
  9. //模块初始化使用
  10. console.log(scoresTable.getItemById(11))
  11. console.log(getItemById(11,scoresTable));
  12.  
  13. //模块初始化使用
  14. console.log(scoresTable.getItemById(22));
  15. console.log(getItemById(11,scoresTable));
  16. console.log(getItemById(22,scoresTable));
  17. console.log(getItemById(11,scoresTable));

执行结果如下:

 

方案二:利用new方法处理。

  1. function Cache(arr){
  2. this.cacheArr=[];
  3. this.arr=arr;
  4. }
  5.  
  6. Cache.prototype.byId=function(id){
  7. var temp=this.cacheArr.find(function (item) {return item.id==id})
  8. if(temp==undefined){
  9. var newItem=this.arr.find(function (item) {return item.id==id});
  10. this.cacheArr.push(newItem);
  11. console.log("New Data")
  12. return newItem;
  13. }else{
  14. console.log("Cache Data")
  15. return temp;
  16. }
  17. }

  测试对象及使用方法:

  1. var scoresTable=[
  2. {id:11,name:"小张",score:80},
  3. {id:22,name:"小王",score:95},
  4. {id:33,name:"小李",score:50},
  5. {id:44,name:"小刘",score:65},
  6. {id:55,name:"小徐",score:84}
  7. ]
  8. var data=new Cache(scoresTable);
  9. console.log(data.byId(11));
  10. console.log(data.byId(11));
  11. console.log(data.byId(11));
  12. console.log(data.byId(22));
  13. console.log(data.byId(22));

  执行结果如下:

写一个根据id字段查找记录的缓存函数(javascript)的更多相关文章

  1. 写一个比较全的进制转换函数--ic

    //写一个比较全的进制转换函数-----未完成 #include <stdio.h> //D进制转换后 (比如10-2进制) 结果可能会很大 需要很长的字符串来存 #include < ...

  2. 更新增加一个门店ID字段的值

    MYSQL因为不能查询一张表时同时更新一张表,同时又会有子查询大于等于一条的情况出现. 分两种情况: 1 直接JOIN 得到一张表. 然后导出做筛选 CREATE TABLE TEST SELECT ...

  3. JS入门学习,写一个时钟~

    <!-- 耽搁了几天,于是又继续回到JS的学习了~~ 各种头大,加油吧... --> <!doctype html><html><head> <t ...

  4. JavaScript写一个连连看的游戏

    天天看到别人玩连连看, 表示没有认真玩过, 不就把两个一样的图片连接在一起么, 我自己写一个都可以呢. 使用Javascript写了一个, 托管到github, 在线DEMO地址查看:打开 最终的效果 ...

  5. 从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)

    从零开始写一个武侠冒险游戏-6-用GPU提升性能(1) ----把帧动画的实现放在GPU上 作者:FreeBlues 修订记录 2016.06.19 初稿完成. 2016.08.05 增加对 XCod ...

  6. 怎么用JavaScript写一个区块链?

    几乎所有语言都可以编写区块链开发程序.那么如何用JavaScript写一个区块链?以下我将要用JavaScript来创建1个简单的区块链来演示它们的内部到底是怎样工作的.我将会称作SavjeeCoin ...

  7. python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)

    python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...

  8. mysql数据库单表只有一个主键自增id字段,ibatis实现id自增

    mysql数据库单表只有一个主键自增id字段,ibatis实现id自增 <insert id="autoid">        insert into user_id ...

  9. 缓存原理,自己写一个缓存类(c#版)

    .net中的MemoryCache是通过内部封装一个静态Dictionary 自己写一个缓存,来看看内部怎么实现的 public class CustomerCache : ICache { priv ...

随机推荐

  1. 认识Backbone (五)

    Backbone.Router(路由)/ Backbone.history(历史)  Backbone.Router 为客户端路由提供了许多方法,并能连接到指定的动作(actions)和事件(even ...

  2. System.Threading.ThreadStateException

    异常:"System.Threading.ThreadStateException"在未处理的异常类型 System.Windows.Forms.dll 发生 其它信息: 在能够调 ...

  3. 流量计算-Jstorm提交Topology过程(下一个)

    马上部分流量计算-Jstorm提交Topology过程(上), 5.上篇任务已经ServiceHandler.submitTopologyWithOpts()方法.在该方法中,会实例化一个Topolo ...

  4. mac eclipse svn subeclipse: Failed to load JavaHL Library.

    Failed to load JavaHL Library. These are the errors that were encountered: no libsvnjavahl-1 in java ...

  5. [译]MVC应用程序生命周期

    原文:MVC Application Lifecycle 来一探究竟在MVC应用程序中参与请求处理的各个不同组件. 目录: 序言 背景 UrlRoutingModule RouteHandler Mv ...

  6. 深入了解C++中间mutablekeyword

         深入理解C++中的mutablekeyword kezunhai@gmail.com http://blog.csdn.net/kezunhai keywordmutable是C++中一个不 ...

  7. [SignalR]注册路由

    原文:[SignalR]注册路由 1.注册SignalR路由 在Asp.Net中,若是SignalR 1.*版本,在Global.asax文件中定义如下: 在Asp.Net中,若是SignalR 2. ...

  8. 用CSS3制作很特别的波浪形菜单

    原文:用CSS3制作很特别的波浪形菜单 网页菜单我们见过很多,各种炫酷的.实用的菜单比比皆是.昨天我看到一款很特别的CSS3菜单,它的外形是波浪形的,弯弯曲曲,结合背景,看上去还挺不错的,下面看下一效 ...

  9. POJ 2774 后缀数组:查找最长公共子

    思考:其实很easy.就在两个串在一起.通过一个特殊字符,中间分隔,然后找到后缀数组的最长的公共前缀.然后在两个不同的串,最长是最长的公共子串. 注意的是:用第一个字符串来推断是不是在同一个字符中,刚 ...

  10. hdu 4407 Sum 容斥+当前离线

    乞讨X-Y之间p素数,,典型的纳入和排除问题,列的求和运算总和的数,注意,第一项是最后一个项目数. 如果不改变到第一记录的答案,脱机处理,能保存查询,候,遇到一个操作1,就遍历前面的操作.把改动加上去 ...