版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/li740207611/article/details/84196592
从map,array数据结构获取特定数据的工具类
使用场景
由于项目中有大量的echats图形,而初始化echats的数据来自一个map或者几个map,或者map数组
而echarts的多条Y轴key是不一样的,而且key比较多,key被配置成常量数组从map、数组中取数据。
example
会用到一个数据格式化函数,详情请点击
/**
* 获取需要的数据
* @param keyArr 需要用到的key数组,这个是根据每个模型配置的常量数组
* @param keyPropertyArr key是一个json结构 key = {"value": "1", ...}
* @param resultMap 数据集
* @param mapPropertyArr resultMap 中包含子map,属性数组
* @param operation "差异分析数据,需要进行的操作:目前只支持+ - * / 操作
* @returns {Array} 根据key的属性,返回相应key属性的二维数组。
*
* 该函数数据通过 + - * / 的运算得到
*/
function getDate2(keyArr, keyPropertyArr1, keyPropertyArr2, operation, data, mapPropertyArr, conPropertyArr, condition) {
//净额=流出-流入
var valueArray1 = getValueArray3(DifConstants.netamountCellArray, keyPropertyArr1, data, mapPropertyArr);
var valueArray2 = getValueArray3(DifConstants.netamountCellArray, keyPropertyArr2, data, mapPropertyArr);
/* 年*/
var valueArray = [valueArray1[0]];
/*获取经评报告,复盘报告 值净额 */
for (var i = 1; i < valueArray2.length; i++) {
valueArray.push(getValueArrayOperation(valueArray2[i], valueArray1[i], operation));
}
/* 获取实际值净额 */
var actualValue = getValueArrayCondition(conPropertyArr, data[condition], arrayValueFormat(valueArray[0], "年", 0 , 0));
valueArray[1] = arrayValueFormat(actualValue[1],"" , 2, 0);
//差异值
valueArray.push(getValueArrayOperation(valueArray[3], valueArray[1], "-"));
return valueArray;
};
/**
* echars 初始化
*/
function echartsInit(valueArray, yAxisName, divName) {
/* 对数组数据进行,格式化 */
valueArray[0] = arrayValueFormat(valueArray[0], "年", 2);
for (var i = 1; i < valueArray.length; i++) {
valueArray[i] = arrayValueFormat(valueArray[i], "", 2);
}
var domDiv = document.getElementById(divName);
var colorArr = ['#20b2aa', '#ffa07a', '#ff0000', '#ffff00'];//图例的颜色,分别对应[实际值,预测值,差异值]
var titleArray = ['实际值', '原值', '修改值', '差异'];
echartsStackedColumn(domDiv, titleArray, colorArr, yAxisName, valueArray);
};
/**
* 函数入口,main函数
* @param data 数据集合
*/
function echartsDrawModel_1(data) {
var keyProperty = ["year", "value", "value", "value"];
var mapProperty = ["replayMap", "outputMap", "outputMap", "replayMap"];
var pa = ["time", "businessIncome"];
var keyProperty1 = ["year", "value1", "value1", "value1"];
var keyProperty2 = ["year", "value2", "value2", "value2"];
pa = ["time", "netCashBusiness"];
valueArray = getDate2(DifConstants.netamountCellArray, keyProperty1, keyProperty2,"-" , data, mapProperty, pa, "modelCashList");
echartsInit(valueArray, "经营活动现金流净额", "echarts_amount");
}
code
/**
* 通过keyArray,获取valueMap中相应key的value
* @param keyArray 由key = {"year": "2018, "value" : "10"} 组成数组
* @param valueMap values 的 map集合
* @param property key的属性,year 或者 value
* @returns {Array} 由keyArray
*/
function getValueArray(keyArray, valueMap, property){
var valueArray = [];
for(var i=0;i<keyArray.length;i++){
var key = keyArray[i];
var value = valueMap[key[property]];//净利润,原值
valueArray.push(value);
}
return valueArray;
}
/**
* @param keyArray key的数组,key是一个json数据结构 suchas key = {"year": "2018, "value" : "10" , ...}
* @param valueMap 所有数据都在一个map中。
* @param propertyArray key的属性数组
* @returns {Array} 二维数组,第i行代表propertyArray[i[属性的所有数据,
*/
function getValueArray2(keyArray, propertyArray, valueMap){
var valueArray = [];
for(var i=0;i<propertyArray.length;i++){
var childArray = [];
for (var j = 0; j < keyArray.length; j ++) {
var key = keyArray[j];
var value = valueMap[key[propertyArray[i]]];//净利润,原值
childArray.push(value);
}
valueArray.push(childArray);
}
return valueArray;
}
/**
* 一个map由几个childMap组成,childMap的key一样,需要从每个childMap取出相同的key组成一个数组
* @param keyArray key的数组,keykey是一个json数据结构 suchas key = {"year": "2018, "value" : "10" , ...}
* @param valueMap 所有数据都在一个map中。
* @param keyPropertyArray key的属性数组 ["value1", "value2", ...]
* @param mapPropertyArray map的属性数组,map中包含map的情况
* such as : map = {"map0": {"value1": "1", "value2": "2"}, "map1": {}, "map2": {}, ...}
* @returns {Array} 二维数组,第i行代表, mapPropertyArray[i]中,
* keyArryay数组所有key的propertyArray[i[属性的数据,
* 注意:keyPropertyArray 和 mapPropertyArray 是一一对应关系
*/
function getValueArray3(keyArray, keyPropertyArray, valueMap,mapPropertyArray){
if (keyPropertyArray.length != mapPropertyArray.length){
console.error("keyPropertyArray , mapPropertyArray length is not equal"+ keyPropertyArray + mapPropertyArray);
return;
}
var valueArray = [];
for(var i=0;i<keyPropertyArray.length;i++){
var childArray = [];
for (var j = 0; j < keyArray.length; j ++) {
var key = keyArray[j][keyPropertyArray[i]];
var value = valueMap[mapPropertyArray[i]][key];
childArray.push(value);
}
valueArray.push(childArray);
}
return valueArray;
}
/**
* 两个数组进行运算, v = v1 operation v1
* @param valueArray1 array of v1
* @param valueArray2 array of v2
* @param operation type String : + - * /
* @returns {Array} array of v
*/
function getValueArrayOperation(valueArray1, valueArray2, operation){
var valueArray = [];
for(var i=0;i<Math.max(valueArray1.length, valueArray2.length);i++){
var v1 = valueArray1[i];
var v2 = valueArray2[i];
switch (operation) {
case "+":
valueArray.push(v1 + v2);
break;
case "-":
valueArray.push(v1 - v2);
break;
case "*":
valueArray.push(v1 * v2);
break;
case "/":
valueArray.push(v1 / v2);
break;
}
}
return valueArray;
};
/**
* value是一个json数据结构 suchas value = {"year": "2018, "value" : "10" , ...}
* @param valueArray 由map of value 组成的数组
* @param propertyArray value的属性数组
* @returns {Array} 二维数组,第i行代表propertyArray[i[属性的所有数据,
*/
function getValueArrayTArray(propertyArray, valueArray){
var rs = [];
for(var i=0;i<propertyArray.length;i++){
var childArray = [];
for (var j = 0; j < valueArray.length; j ++) {
var value = valueArray[j];
var key = propertyArray[i];
childArray.push(value[key]);
}
rs.push(childArray);
}
return rs;
};
/**
* 遍历conditionArray判断valueArry中index下标的数组,如果相等则取出propertyArray中的值,
* 返回一个新的数组,数组长度是codnitionArray的长度
* @param conditionArray 条件数组,目前只能支持相等判断
* @param propertyArray propertyArray value的属性数组
* @param valueArray 由value组成的数组,value是一个json数据结构 suchas value = {"year": "2018, "value" : "10" , ...}
* @param index valueArray 中作为判断条件的索引,从0开始,如果为null则设置为0
*/
// var pa = ["year", "value"];
// var va = [{"year":"2016", "value":"1992"}, {"year":"2017", "value":"1993"}, {"year":"2019", "value":"1994"}];
// var ca = ["2016", "2017", "2018", "2019", "2020"];
// getValueArrayCondition(pa, va, ca, null);
function getValueArrayCondition(propertyArray, valueArray, conditionArray, index) {
var rs = [];
valueArray = getValueArrayTArray(propertyArray, valueArray) ;
index = index == null? 0 : index;
var indexCondition = null;
var indexValue = null;
var valueCondition = null;
var valueValue = null;
for(var i=0;i<propertyArray.length ;i++) {
var childArray = [];
indexValue = 0;
indexCondition = 0;
for (indexCondition = 0, indexValue = 0; indexCondition < conditionArray.length && indexValue < valueArray[index].length;) {
valueCondition = conditionArray[indexCondition];
valueValue = valueArray[index][indexValue];
if (valueCondition == valueValue) {
childArray.push(valueArray[i][indexValue]);
indexValue++;
indexCondition++;
} else if (valueCondition < valueValue) {
indexCondition++;
childArray.push(undefined);
} else {
indexValue++;
}
}
while (indexCondition < conditionArray.length){
childArray.push(undefined);
indexCondition++;
}
rs.push(childArray);
}
return rs;
}