数据:

账单id[1,1,1,1,2,2,2,3,3,3,3,3,3,3],

相对于账单id的金额[100,120,110,150,200,180,220,115,150,120,180,220,140,200],

要求:

去重账单id数组,按id分组账单金额总额数组,按账单分组账单金额明细(二维数组)。

JS方法实现:(该方法的前提是id与金额一一对应,且id已经排序)

  /**
* 重构公司id和金额数组
* @param arrId:companyId数组
* @param arrAmount:金额数组
* @returns ids:去重后的id数组
* @returns amount:按id分组求和的金额数组
* @returns groupAmount:按id分组的二位金额数组
*/
function uniqueArray(arrId,arrAmount){
var ids = new Array(); //存放id新数组
var amount = new Array();//存放金额新数组
var groupAmount = new Array();//分组金额数组
var res =[ids,amount,groupAmount];//结果数组
var json = {};
var index =0;
for(var i = 0; i < arrId.length; i++){
if(!json[arrId[i]]){//不重复操作
ids.push(arrId[i]);
amount.push(arrAmount[i]);
json[arrId[i]] = 1;
groupAmount[index]=new Array();//声明二维数组
groupAmount[index].push(arrAmount[i]);
index++;
}else{ //重复时操作
amount[index-1] = parseFloat(amount[index-1])+ parseFloat(arrAmount[i]);
groupAmount[index-1].push(arrAmount[i]);
}
}
return res;
}

无序id的实现后续。。。

无序id数组的实现,示例代码如下:

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<script type="text/javascript">
var arrId =[1,1,2,1,3,1,2,3,3,3,2,3,3,3];
var arrAmount = [100,120,110,150,200,180,220,115,150,120,180,220,140,200];
var tmpRes = uniqueArray(arrId,arrAmount);
alert(tmpRes[0]+'----'+tmpRes[1]+'----'+tmpRes[2][0]+'||'+tmpRes[2][1]+'||'+tmpRes[2][2]);
function uniqueArray(arrId,arrAmount){
var ids = new Array(); //存放id新数组
var amount = new Array();//存放金额新数组
var groupAmount = new Array();//分组金额数组
var res =[ids,amount,groupAmount];//结果数组
var json = {};
var index =0;
for(var i = 0; i < arrId.length; i++){
if(!json[arrId[i]]){//不重复操作
ids.push(arrId[i]);
amount.push(arrAmount[i]);
json[arrId[i]] = 1;
groupAmount[index]=new Array();//声明二维数组
groupAmount[index].push(arrAmount[i]);
index++;
}else{ //重复时操作
//求arrId[i]的值位于ids的位置--这样才保证无序也可以实现
var ins = getIndexofOb(ids,arrId[i]);
// amount[index-1] = parseFloat(amount[index-1])+ parseFloat(arrAmount[i]);
// groupAmount[index-1].push(arrAmount[i]);
amount[ins] = parseFloat(amount[ins])+ parseFloat(arrAmount[i]);
groupAmount[ins].push(arrAmount[i]);
}
}
return res;
} /**
* 返回ob在arrOb中索引值,若不存在,返回-1
* @param arrOb
* @param ob
* @returns {number}
*/
function getIndexofOb(arrOb,ob){
for(var i= 0;i<arrOb.length;i++){
if(ob==arrOb[i]){
return i;
}
}
return -1;
}
</script>
<body> </body>
</html>

JS去重函数的扩展应用的更多相关文章

  1. JS的函数

    函数由四部分组成 function+function name+parameter+body 方法调用模式 Object.add(); 函数调用模式: add(3,4) 构造器调用模式:JS是基于原型 ...

  2. JS匿名函数的理解

    js匿名函数的代码如下:(function(){ // 这里忽略jQuery 所有实现 })(); 半年前初次接触jQuery 的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的 ...

  3. ES6入门之函数的扩展

    函数js原有的: 属性:arguments[].caller(调用该函数的引用,注意与callee分别开,callee指的是调用函数本身经常在递归中出现).length(形参个数).prototype ...

  4. IE7、IE8不兼容js trim函数的解决方法

    IE兼容,有时候让人头疼,但又不得不去解决. 先看看一下代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xh ...

  5. 转载 jQuery和js自定义函数和文件的方法(全网最全)

    jQuery和js自定义函数和文件的方法(全网最全)    版权声明:本文为像雾像雨又像风_http://blog.csdn.net/topdandan的原创文章,未经允许不得转载. https:// ...

  6. 【node.js】函数、路由

    Node.js中函数的使用与Javascript类似,一个函数可以作为另一个函数的参数.我们可以先定义一个函数,然后传递,也可以在传递参数的地方直接定义函数. function say(word) { ...

  7. ES6 - Note3:数组、对象与函数的扩展

    一.数组的扩展,ES6在数组扩展了一些API,以实现更多的功能 1.Array.from:可以将类数组和可遍历的数据结构转换成真正的数组,如下所示 var a = { '0':1,'1':1,leng ...

  8. JS回调函数全解析教程

    转自:http://blog.csdn.net/lulei9876/article/details/8494337 自学jQuery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速g ...

  9. 学习js回调函数

    <!DOCTYPE HTML> <html> <head> <meta charset="GBK" /> <title> ...

随机推荐

  1. PHP实现快速排序算法相关案例

    <?php /** * 快速排序 --主要运用递归, 先把一个数找准位置,然后再递归把左右两边的数都找准位置 */ function QSort($a= []){ $nCount = count ...

  2. Properties in Algebra

    附录-Properties in Algebra 部分证明转载自标注,仅作个人整理查阅用. 范数 (norm) \(^{[1]}\) 要更好的理解范数,就要从函数.几何与矩阵的角度去理解,我尽量讲的通 ...

  3. JAVA多线程之状态转换图

    线程状态转换图如下: 1.新建(new):线程对象被创建后就进入了新建状态.如:Thread thread = new Thread(); 2.就绪状态(Runnable):也被称为“可执行状态”.线 ...

  4. python装饰器的参数传递

    被装饰器装饰的函数名即使没有被调用(因为有@xxx,会触发运行装饰器),(装饰器工厂函数)定义装饰器的代码已经运行了(最内部的那个函数并没有运行)(把被装饰的原函数引用赋值给了装饰器内部的那个函数名) ...

  5. springboot+mybatis+通用mapper+多数据源(转载)

    1.数据库准备 数据库表我们在springboot-mybatis数据之外,新建数据库springboot-mybatis2: springboot-mybatis数据库中有t_class表: spr ...

  6. Python—插入排序算法

    # 插入排序,时间复杂度O(n²) def insert_sort(arr): """ 插入排序:以朴克牌为例,从小到大排序.摸到的牌current与手里的每张牌进行对比 ...

  7. ZJNU 2136 - 会长的正方形

    对于n*m网格 取min(n,m)作为最大的正方形边长 则答案可以表示成 s=1~min(n,m) 对于一个s*s的正方形 用oblq数组储存有多少四个角都在这个正方形边上的正方形 以4*4为例 除了 ...

  8. Google Guava入门教程

    以下资料整理自网络 一.Google Guava入门介绍 引言 Guava 工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [cachi ...

  9. ruoyi StringUtils

    package com.ruoyi.common.utils; import java.util.Collection; import java.util.Map; import com.ruoyi. ...

  10. UML-如何迭代

    未完待续...