写一个根据id字段查找记录的缓存函数(javascript)

前不久在参加面试的时候遇到了这样一道题,"写一个根据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

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

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

MYSQL因为不能查询一张表时同时更新一张表,同时又会有子查询大于等于一条的情况出现. 分两种情况: 1 直接JOIN 得到一张表. 然后导出做筛选 CREATE TABLE TEST SELECT * FROM `1月第三周控奶新客沟通清单_copy` AS a LEFT JOIN arm_changsha.sys_office AS b ON b.`name` = a.`门店`; 2 做一张临时表,插入需要的字段. 这样可以完成.但是比较麻烦.思考一下更优的方法 ALTER TABLE `1

大神手把手教你写一个页面模板引擎,只需20行Javascript代码!

只用20行Javascript代码就写出一个页面模板引擎的大神是AbsurdJS的作者,下面是他分享的全文,转需. 不知道你有木有听说过一个基于Javascript的Web页面预处理器,叫做AbsurdJS.我是它的作者,目前我还在不断地完善它.最初我只是打算写一个CSS的预处理器,不过后来扩展到了CSS和HTML,可以用来把Javascript代码转成CSS和HTML代码.当然,由于可以生成HTML代码,你也可以把它当成一个模板引擎,用于在标记语言中填充数据. 于是我又想着能不能写一些简单的代

【转】写一个通用的事件侦听器函数

// event(事件)工具集,来源:github.com/markyun markyun.Event = { // 页面加载完成后 readyEvent : function(fn) { if (fn==null) { fn=document; } var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = fn; } else { window.onload = functi

写一个实现字符串首字母大写的函数

var str="ralkhasdlfho"; var newStr; function change(str){ newStr=str.substring(0,1).toUpperCase()+str.substring(1); } change(str); document.write(newStr); </script>

Python练习-写一个求实数内二次方程解的函数

def quar(a,b,c): if not isinstance(a,(int,float))|isinstance(b,(int,float))|isinstance(c,(int,float)): raise TypeError('Wrong Type inputing!') else: from math import sqrt tmp1=b**2-4*a*c if tmp1>0: return '%.04f'%float((-b+sqrt(tmp1))/(2*a)),'%.04f'%

自己写一个文字过长显示省略号的函数

function  points(strin,num){ //strin表示目标字符,num表示在第几个字符用省略号显示 var Str = "",len = strin.length; if(len<=num){ Str = strin; }else if(num <= 3){ Str = strin.slice(0,num).trim() + "..."; }else{ Str =strin.slice(0,num-3) + "...&qu

写一个通用的事件侦听器函数

/ event(事件)工具集 markyun.Event = { // 页面加载完成后 readyEvent : function(fn) { if (fn==null) { fn=document; } var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = fn; } else { window.onload = function() { oldonload(); fn(

使用类的静态字段和构造函数,请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。

1.程序设计思想 定义一个静态字段,在构造函数中写一个这个静态字段自加的语句,这样,因为静态字段不会因为再次调用而改变数值所以可以计算建立对象的个数. 2.程序源代码 //使用类的静态字段和构造函数跟踪对象 class sum{  public static int a=0;   int c;   public sum(int cc)  {   c=cc;   a++;  }  public int get()  {   return a;  } } public class WyText_LL

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

<!-- 耽搁了几天,于是又继续回到JS的学习了~~ 各种头大,加油吧... --> <!doctype html><html><head> <title>数码时钟</title> <meta charset="gb2312"> <style type="text/css"> *{ padding:0; margin:0;} body{background:rgb(0,2