review一个javascript功能函数
近半年来一直觉得自己在技术上好像左右挣扎,技术没啥提升,看书看不进,自学还挺慢。写出来的东西,自己都觉得不满意。让自己也用庸人自扰的感觉。
最近,在工作中,有一个小小的功能需要实现,这个功能非常简单,其大概功能是:当有一批商品需要促销时,满多少到多少元区间立减多少元,再比较离下一个优惠区间还差多少元,并提示下一区间的优惠价。比如,我这里有个价格优惠区间(满50减5,满100减10,满150减15,满200减20),如果我现在买了120元商品,那么我的提示就应该是:已优惠10,还差30元,可优惠15元。
这个功能是满简单的,因为优惠的价格区间是变化的,没办法在程序中写死。所以后端的同学就会把这个优惠的价格区间用一种字符格式输出来,我们再进行处理。字符格式如下:
<input type="hidden" name="priceRange" value="50:5,100:10,150:15,200:20" />
我是直接把input的value处理成了一个对象{'50':5, '100':10, '150':15, '200':20}方便我我以后的处理。
为了能获取价格区间,我创建一个数组用来存放对象的key值,也就是所说的价格区间。
var priceRange = {'50':5, '100':10, '150':15, '200':20};
function getPrice(num,priceRange) {
    var oPrice = priceRange || {},
        aPrice = [],
        _pro;
    for (_pro in oPrice) {
        aPrice.push(_pro);
    }
    // ...
}
接下来就是通过循环这个价格区间找出优惠的价格,并返回一个结果对象。
var priceRange = {'50':5, '100':10, '150':15, '200':20};
function getPrice(num,priceRange) {
    // ...
    for (var i = 0, len = aPrice.length; i < len; i++) {
        if (aPrice[0] > num) {
            break;
        }
        if (i === (len - 1)) {
            if (aPrice[i] <= num) {
                return {
                    hasPrice: oPrice[aPrice[i]]
                }
            }
        } else {
            if (aPrice[i] <= num && num < aPrice[i + 1]) {
                return {
                    hasPrice: oPrice[aPrice[i]],
                    price: aPrice[i + 1] - num,
                    youhui: oPrice[aPrice[i + 1]]
                }
            }
        }
    }
    // ...
}
上面就是这个功能实现的比较关键的部分,下面看下完整的代码:
var priceRange = {'50':5, '100':10, '150':15, '200':20};
function getPrice(num, priceRange) {
    var oPrice = priceRange || {},
        aPrice = [],
        _pro;
    for (_pro in oPrice) {
        aPrice.push(_pro);
    }
    for (var i = 0, len = aPrice.length; i < len; i++) {
        if (aPrice[0] > num) {
            break;
        }
        if (i === (len - 1)) {
            if (aPrice[i] <= num) {
                return {
                    hasPrice: oPrice[aPrice[i]]
                }
            }
        } else {
            if (aPrice[i] <= num && num < aPrice[i + 1]) {
                return {
                    hasPrice: oPrice[aPrice[i]], // 此价格的优惠价
                    price: aPrice[i + 1] - num, // 此价格离下一个价格的差
                    youhui: oPrice[aPrice[i + 1]] // 离下一个价格的优惠价
                }
            }
        }
    }
    return {
        hasPrice: 0,
        price: aPrice[0] ? aPrice[0] - num : 0,
        youhui: aPrice[1] ? oPrice[aPrice[1]] : 0
    }
}
console.log(getPrice(12, priceRange));
虽然,这个功能的代码写出来了,但是我总觉得那个地方写不好,但是自己却发现不了。所以,写出来,大家帮我code review.看看有没有更好的写法,不要吝惜自己的才华,请在评价那里一展你的风采。
review一个javascript功能函数的更多相关文章
- Functions类,一个Javascript的函数加法类,将两个函数加起来,顺序执行
		以下是类的代码: var Functions = { oFunctions: null, add: function (oFunc, oNewFunc) { var oNew = function ( ... 
- 关于 URL 编码及 JavaScript 编码函数【转载+整理】
		原文地址:http://www.ruanyifeng.com/blog/2010/02/url_encoding.html 本文内容 引入 环境 测试 JavaScript 编码函数 引入 URL ... 
- JavaScript功能检测技术和函数构造
		Javascript与很多编程语言不同,它不能够控制其运行环境.再写php代码时,只要在服务器端部署了正确的版本,那么程序就绝对能够运行,对于其他python或ruby后端语言来说,也不存在什么灰色区 ... 
- js javascript map函数去重功能的使用实例
		js javascript map函数去重功能的使用实例 先上一个实战例子代码 var map = new Map(); for(var i=0; i<=9; i++){ map.set(i,i ... 
- 一个JavaScript触发器插件,可通过指定频次、指定时间内触发指定的处理函数
		js-trigger是一个JavaScript触发器插件,可通过指定频次.指定时间内触发指定的处理函数 Tango<tanwei_yx@126.com> 特性 支持AMD/CMD/Comm ... 
- 推荐一个JavaScript触发器插件,可通过指定频次、指定时间内触发指定的处理函数
		推荐一个JavaScript触发器插件js-trigger js-trigger是一个JavaScript触发器插件,可通过指定频次.指定时间内触发指定的处理函数 https://tanwei-cc. ... 
- JavaScript中函数作为另一个函数的参数的时候它存在于哪个作用域
		一直对函数作为参数被传递进另外一个函数理解的不是很清除.先看下这段代码吧: function test(fn){ var bar = 1; fn(); } var bar = 99; test(fun ... 
- 理解 JavaScript 回调函数并使用
		JavaScript中,函数是一等(first-class)对象:也就是说,函数是 Object 类型并且可以像其他一等对象(String,Array,Number等)一样使用.它们可以"保 ... 
- 创建你的第一个JavaScript库
		是否曾对Mootools的魔力感到惊奇?是否有想知道Dojo如何做到那样的?是否对jQuery感到好奇?在这个教程中,我们将了解它们背后的东西并且动手创建一个超级简单的你最喜欢的库. 我们其乎每天都在 ... 
随机推荐
- 请描述一下 cookies,sessionStorage和localStorage的区别?
			cookie在浏览器和服务器间来回传递. sessionStorage和localStorage不会sessionStorage和localStorage的存储空间更大:sessionStorage和 ... 
- GeoServer之sqlserver插件安装
			GeoServer之sqlserver插件安装 GeoServer可以直接从sqlserver中获取数据,用来发布wms服务.但是其sqlserver连接插件并没有直接集成在Geoserver中,需要 ... 
- STL : 反向迭代器(Reverse Iterator)
			1. 定义反向迭代器(Reverse Iterator)是一种反向遍历容器的迭代器.也就是,从最后一个元素到第一个元素遍历容器.反向迭代器将自增(和自减)的含义反过来了:对于反向迭代器,++运算将访问 ... 
- 【转】Unity3d:读取FBX中的动画
			从模型中获得切割好的动画clip,并且对其中设置好的动画事件进行修改方法: 1.动画模型后缀为.FBX.在Unity3d中,能够显示FBX中的动画.要加载模型中的AnimationClip,只要Ass ... 
- Django restframework Token拥有不过期的认证
			REST框架中的Token认证不像Session认证一样,它是没有办法设置过期时间的,但是有时我们需要对Token做过期验证,比如说用户在A设备登陆之后获取一个Token,如果用户在没有清空浏览器缓存 ... 
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 18—Photo OCR 应用实例:图片文字识别
			Lecture 18—Photo OCR 应用实例:图片文字识别 18.1 问题描述和流程图 Problem Description and Pipeline 图像文字识别需要如下步骤: 1.文字侦测 ... 
- slf4j日志框架
- VUE+WebPack前端游戏设计:实现物体的拖拽动态特效
- -other linker flags - 详解
			• 值:-objC,-all_load,-force_load • -objC: 在iOS 中,使用-all_load时,如果静态库中有类别时会出问题,使用其他两个值则不会有问题. • -al ... 
- shiro 权限集成Ehcache 配置 学习记录(二)
			1.加入依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-eh ... 
