写一个根据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));

 

执行结果如下:

 

 

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

 

function Cache(arr){
	this.cacheArr=[];
	this.arr=arr;
}

Cache.prototype.byId=function(id){
		var temp=this.cacheArr.find(function (item) {return item.id==id})
    if(temp==undefined){
        var newItem=this.arr.find(function (item) {return item.id==id});
        this.cacheArr.push(newItem);
        console.log("New Data")
        return newItem;
    }else{
        console.log("Cache Data")
        return temp;
    }
}

 

  测试对象及使用方法:

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}
]
var data=new Cache(scoresTable);
console.log(data.byId(11));
console.log(data.byId(11));
console.log(data.byId(11));
console.log(data.byId(22));
console.log(data.byId(22));

 

  执行结果如下:

 

转载于:https://www.cnblogs.com/xuhang/p/5495496.html

好的,以下是一个简单的动态进度条显示函数: ```python from django.http import HttpResponse import json def progress(request): data = { 'progress': 0 # 初始进度为0 } response = HttpResponse(json.dumps(data), content_type='application/json') response['Cache-Control'] = 'no-cache' # 防止缓存 response.streaming = True response.write('\n') for i in range(1, 101): data['progress'] = i # 更新进度 response.write('data: {0}\n\n'.format(json.dumps(data))) response.flush() # 刷新缓冲区,使数据立即发送到客户端 import time time.sleep(0.1) # 模拟处理过程,每0.1秒更新一次进度 return response ``` 在上述代码中,我们定义了一个 `progress` 视图函数,该函数返回一个JSON格式的响应,其中包含一个 `progress` 字段表示当前进度。然后我们使用 Server-Sent Events 技术(即服务器推送事件)来实现动态刷新进度条。 具体来说,我们设置响应的 `content_type` 为 `application/json`,并将其 `streaming` 属性设置为 `True`,以告诉浏览器该响应是一个流式响应。然后我们在响应中依次发送每个进度值,并在每个 JSON 数据后面加上一个空行,以满足 Server-Sent Events 的格式要求。最后,我们使用 `flush()` 方法刷新响应缓冲区,以使数据立即发送到客户端。 在前端页面中,我们可以使用 JavaScript 来监听这个进度条视图的响应,并更新页面上的进度条。具体实现方式可以参考以下代码: ```javascript var source = new EventSource('/progress'); source.onmessage = function(event) { var data = JSON.parse(event.data); var progress = data.progress; // 更新进度条的显示 // ... }; ``` 在上述代码中,我们使用 `EventSource` 对象来监听 `/progress` 这个视图函数的响应。每当有新的 JSON 数据到达时,`onmessage` 回调函数就会执行,我们可以从事件对象中获取到新的进度值,然后更新页面上的进度条显示。 注意:为了使 Server-Sent Events 技术正常工作,你需要使用支持该技术的浏览器,比如 Chrome、Firefox 等。如果你使用的是 Internet Explorer 或 Edge 等不支持该技术的浏览器,则无法正常显示进度条。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值