使用 Javascript  编程, 组合使用 JSON 数据格式,Mapping 和回调技术, 可以产生很强的表达效果。 在实际工作中, 总会有数据汇总的需求。 比如说, 取得了多个 device 的性能数据, 现在希望能够对其中的若干字段进行不同的汇总(有的求和,有的求平均值,有的求最大值),得到所有Device 的总的性能状况。

具体怎么实现呢? 显然, 对于指定的不同字段, 需要不同的数据汇总函数, 可以使用一个 Mapping 来管理字段与数据汇总函数之间的映射关系,并采用回调方式来计算归总值; 通常返回数据都会采用对象数组的结构, javascript 对 JSON 格式的数据操作非常方便。

具体实现代码如下( 可以直接复制到 JS 控制台执行):

  

/**
* 对多个chart数据的指定字段使用指定函数进行汇总
* @param chartDataArray chart 数据数组, 结构: [[{'timestamp': 'xxx1', 'field1': 'xxx1', 'field2': 'yyy1'}], [{'timestamp': 'xxx1', 'field1': 'xxx2', 'field2': 'yyy2'}]]
* 这些 chart 的长度应该是相同的
* @param fieldFuncMapping字段与聚合函数的映射, 结构: {'field1': func1, 'field2':func2 }
* @return 单个 chart 数据, 结构 [{'timestamp': 'xxx1', 'field1': func1('xxx1', 'xxx2'), 'field2': func2('yyy1', 'yyy2')}]
*/
var summary = function(chartDataArray, fieldFuncMapping) {
var i=0, k=0;
var chartNum = (chartDataArray == null ? 0 : chartDataArray.length);
var chartLength = (chartDataArray[0] == null ? 0 : chartDataArray[0].length);
var result = [];
var dataArrayForSinglePoint = [];
var dataSummaryForSinglePoint = 0;
var dataSummaryObjForSinglePoint = {};
var singleData = 0;
var dataItem = {};
var dataItemProperty = {};
var fieldSummaryFunc = null;
if (chartNum == 0 || chartLength == 0) {
return [];
}
dataItemProperty = chartDataArray[0][0];
for (k=0; k < chartLength; k++) {
dataSummaryObjForSinglePoint = {};
for (var field in dataItemProperty) {
dataArrayForSinglePoint = [];
for (i=0; i<chartNum;i++) {
dataItem = chartDataArray[i][k];
singleData = dataItem[field];
dataArrayForSinglePoint.push(singleData);
}
fieldSummaryFunc = fieldFuncMapping[field];
if (fieldSummaryFunc == null) {
fieldSummaryFunc = obtainFirstFunc;
}
dataSummaryForSinglePoint = fieldSummaryFunc(dataArrayForSinglePoint);
dataSummaryObjForSinglePoint[field] = dataSummaryForSinglePoint;
}
result.push(dataSummaryObjForSinglePoint);
}
return result;
}
var obtainFirstFunc = function(array) {
return array[0];
}
var sumFunc = function(array) {
var i=0, sum = 0;
var len = (array == null ? 0 : array.length);
if (len == 0) { return 0; }
for(i=0; i<len; i++) {
sum += array[i];
}
return sum;
}
var averageFunc = function(array) {
var i=0, sum = 0;
var len = (array == null ? 0 : array.length);
if (len == 0) { return 0; }
sum = sumFunc(array);
return sum / len;
}
var testFunc = function() {
var chart1 = [{'time': 'time1', 'num': 13, 'grade': 95}, {'time': 'time2', 'num': 15, 'grade': 99}, {'time': 'time3', 'num': 16, 'grade': 94}];
var chart2 = [{'time': 'time1', 'num': 16, 'grade': 93}, {'time': 'time2', 'num': 14, 'grade': 95}, {'time': 'time3', 'num': 18, 'grade': 97}];
var fieldFuncMapping = {'num': sumFunc, 'grade': averageFunc};
var chart = summary([chart1, chart2], fieldFuncMapping);
console.log(chart);
}
testFunc();

附上一个 javascript 的陷阱:

javascript编程: JSON, Mapping, 回调的更多相关文章

  1. JavaScript高级编程———JSON

    JavaScript高级编程———JSON < script > /*JSON的语法可以表达一下三种类型的值 简单值:使用与javas相同的语法,可以在JSON中表达字符串.数值.布尔值和 ...

  2. 学习现代 JavaScript 编程的最佳教程

    天天编码 , 版权所有丨本文标题:0.0 学习现代 JavaScript 编程的最佳教程 转载请保留页面地址:http://www.tiantianbianma.com/the-modern-java ...

  3. Javascript编程风格

    Douglas Crockford是Javascript权威,Json格式就是他的发明. 去年11月他有一个演讲(Youtube),谈到了好的Javascript编程风格是什么.我非常推荐这个演讲,它 ...

  4. Javascript编程模式(JavaScript Programming Patterns)Part 1.(初级篇)

    JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript librar ...

  5. javascript编程思想

    javascript编程开发修炼之道   提要文摘附注: 本文的核心内容是围绕javascript前端开发的编程技术要素,来深入地探讨编写高质量的javascript代码的方法.技巧.规范和最佳实践, ...

  6. 小白科普之JavaScript的JSON

    一.对json的理解     json是一种数据格式,不是一种编程语言,json并不从属于javascript.     json的语法可以表示以下三种类型的值     1)简单值           ...

  7. JavaScript 拼接JSON

    <script language="javascript" type="text/javascript"> var json="" ...

  8. 在Javascript操作JSON对象,增加 删除 修改

    在Javascript操作JSON对象,增加删除修改全有的,详情见代码 <script type="text/javascript"> var jsonObj2 = { ...

  9. JavaScript对Json的增删改属性

    <script type="text/javascript"> var json = { "age":24, "name":&q ...

随机推荐

  1. Java Web页面跳转

    Java Web的页面跳转分服务器跳转和客户端跳转: 服务器端跳转  的特点是:跳转之后浏览器的地址栏不会发生任何变化,在使用rquest属性范围时,能将request属性保存到跳转页.执行到跳转语句 ...

  2. js通过sessionStorage实现的返回上一页

    通常,我们都会使用比较熟悉的javascript:history.go(-1)来实现返回上一页,此种方法有一个问题就是返回上一页后不能刷新当前页面,给我们的开发带来了一定的不便,显然有时这种方法就不是 ...

  3. 常用JQ特效代码

    /** * hhBase 平台js * User: huanhuan * QQ: 651471385 * Email: th.wanghuan@gmail.com * 微博: huanhuan的天使 ...

  4. marquee滚动语法

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  5. 做为一名dba你应该知道这些数据恢复

    1.将备份数据   拉取到本地虚拟机上 进行恢复(千万不要把数据直接恢复到生产中,除非迫不得已!!)   2.在本地虚拟机上恢复之后,导出需要恢复的数据.   3.在本地虚拟机上恢复做恢复测试.   ...

  6. 【HDU4578 Transformation】线段树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4578 题意:有一个序列,有四种操作: 1:区间[l,r]内的数全部加c. 2:区间[l,r]内的数全部 ...

  7. form表单提交controller层接收到的值为乱码的问题

    今天遇到个中文乱码问题,大体情况是这样的:前台有一个form表单,其中有几个input的控件,值是带中文的,form表单只设置了id='form1' method='post'  action='xx ...

  8. 局域网访问本地localhost页面

    1.关闭防火墙 2.cmd - ipconfig - IPv4 地址 . . . . . . . . . . . . : 192.168.0.34 如果链接的是wifi,请右键确保手机和电脑链接同一个 ...

  9. wa~哭笑天使

    #include <stdio.h> #define M 301 int r[M], c[M]; int main() { int k, m, n, i, j, sum, flag, t; ...

  10. Print all nodes at distance k from a given node

    Given a binary tree, a target node in the binary tree, and an integer value k, print all the nodes t ...