从map,array数据结构获取特定数据的工具类

js 同时被 3 个专栏收录
4 篇文章 0 订阅
19 篇文章 0 订阅
2 篇文章 0 订阅

从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;
}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值