近半年来一直觉得自己在技术上好像左右挣扎,技术没啥提升,看书看不进,自学还挺慢。写出来的东西,自己都觉得不满意。让自己也用庸人自扰的感觉。

最近,在工作中,有一个小小的功能需要实现,这个功能非常简单,其大概功能是:当有一批商品需要促销时,满多少到多少元区间立减多少元,再比较离下一个优惠区间还差多少元,并提示下一区间的优惠价。比如,我这里有个价格优惠区间(满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功能函数的更多相关文章

  1. Functions类,一个Javascript的函数加法类,将两个函数加起来,顺序执行

    以下是类的代码: var Functions = { oFunctions: null, add: function (oFunc, oNewFunc) { var oNew = function ( ...

  2. 关于 URL 编码及 JavaScript 编码函数【转载+整理】

    原文地址:http://www.ruanyifeng.com/blog/2010/02/url_encoding.html 本文内容 引入 环境 测试 JavaScript 编码函数   引入 URL ...

  3. JavaScript功能检测技术和函数构造

    Javascript与很多编程语言不同,它不能够控制其运行环境.再写php代码时,只要在服务器端部署了正确的版本,那么程序就绝对能够运行,对于其他python或ruby后端语言来说,也不存在什么灰色区 ...

  4. js javascript map函数去重功能的使用实例

    js javascript map函数去重功能的使用实例 先上一个实战例子代码 var map = new Map(); for(var i=0; i<=9; i++){ map.set(i,i ...

  5. 一个JavaScript触发器插件,可通过指定频次、指定时间内触发指定的处理函数

    js-trigger是一个JavaScript触发器插件,可通过指定频次.指定时间内触发指定的处理函数 Tango<tanwei_yx@126.com> 特性 支持AMD/CMD/Comm ...

  6. 推荐一个JavaScript触发器插件,可通过指定频次、指定时间内触发指定的处理函数

    推荐一个JavaScript触发器插件js-trigger js-trigger是一个JavaScript触发器插件,可通过指定频次.指定时间内触发指定的处理函数 https://tanwei-cc. ...

  7. JavaScript中函数作为另一个函数的参数的时候它存在于哪个作用域

    一直对函数作为参数被传递进另外一个函数理解的不是很清除.先看下这段代码吧: function test(fn){ var bar = 1; fn(); } var bar = 99; test(fun ...

  8. 理解 JavaScript 回调函数并使用

    JavaScript中,函数是一等(first-class)对象:也就是说,函数是 Object 类型并且可以像其他一等对象(String,Array,Number等)一样使用.它们可以"保 ...

  9. 创建你的第一个JavaScript库

    是否曾对Mootools的魔力感到惊奇?是否有想知道Dojo如何做到那样的?是否对jQuery感到好奇?在这个教程中,我们将了解它们背后的东西并且动手创建一个超级简单的你最喜欢的库. 我们其乎每天都在 ...

随机推荐

  1. Visual Studio Online 删除项目

    TFS Online在经过一段很长时间的预览阶段后,现在已经改名成Visual Studio Online(简称VS Online),正式成为微软的开发测试云在线服务.撸主最近在上面建了几个测试项目玩 ...

  2. (文件名.JAVA)的文件名只能与该文件中的public类的名称一致

    1.如果类Yuangong 被声明为公共的(public),那么必须将类Yuangong 保存在名为Yuangong.java的文件中:2.反之,在一个文件中最多包含一个顶级的公共类,并且该公共类的名 ...

  3. yum问题的解决办法

     关于使用yum“The program package-cleanup is...”的解决办法   在使用yum 时总是有提示信息: The program package-cleanup is f ...

  4. C++中的运算符重载练习题

    1.RMB类 要求: 定义一个RMB类 Money,包含元.角.分三个数据成员,友元函数重载运算符‘+’(加)   和 ‘-’(减),实现货币的加减运算     例如:    请输入元.角 分:    ...

  5. Pathway富集分析气泡图

    data.tsv > pathway = read.table("data.tsv",header = T, sep="\t") > library ...

  6. Mysql本地服务器安装

    1.下载并解压 2.新建my.ini my.ini内容如下(路径填写自己的): ------------------------------------------------------------ ...

  7. JVM常用参数设置

    堆内存设置 示例: java -Xmx4550m -Xms4550m -Xss128k -XX:NewRatio=5 -XX:SurvivorRatio=5 -Xmx4550m:设置JVM最大可用内存 ...

  8. 查看Java文件对应的字节码

    1. 编译为class文件:javac 2. 使用javap查看bytecode:javap -v

  9. 项目通过nginx强转为https访问后,代码中重定向的连接又变成了http协议,导致点击页面按钮,后台逻辑处理完后重定向报错了

    修改如下,需要在nginx对应的server下的location中增加配置,使重定向的地址协议取当前链接的协议,而不是nginx访问tomcat的协议,因为nginx访问tomcat是http的,并没 ...

  10. Rhythmk 一步一步学 JAVA (17):Servlet 文件上传

    1.环境 : JDK 1.6 , Tomcat 7.0 2.第三方类库: commons-fileupload-1.3.1.jar commons-io-2.4.jar 3.web.xml配置: &l ...