数据转化的问题

假如说我现在有一段这样的数据

type=line&areaStyle.show=true&lineStyle.normal.color=#000
&lineStyle.normal.width=2
type=bar&areaStyle.show=false&lineStyle.normal.color=#fff
&lineStyle.normal.width=

从数据中我们可以看出从type开始到lineStyle.normal.width结束重复了,我需要的是重复了几次就往数组里塞几个对象,以上重复了两段那么最终的格式如下,我是一点都摸不着头绪,js这方面比较弱,望大神指点,最好能简单阐述下思路我可以慢慢研究

[
{
  type:'line',
  areaStyle:{
    show:true
  },
  lineStyle:{
    normal:{
      color:'#000',
      width:2
    }
  }
},
{
  type:'bar',
  areaStyle:{
    show:true
  },
  lineStyle:{
    normal:{
      color:'#fff'
      width:
    }
  }
},
]
阅读 2.4k
3 个回答
function formatter(str) {
    var result = [];
    var array = str.split("&");
    var obj = {};
    if (str == "") return result;
    array.forEach(function(item, index) {
        var current = item.split("=");
        var key = current[0];
        if (key === "type" && index) {
            result.push(obj);
            obj = {}
        }

        var value = current[1];
        var keyArray = key.split(".");
        var keyArrayLen = keyArray.length - 1;
        var i = 0;
        var tmp = obj;
        
        while(i < keyArrayLen) {
            var j = tmp[keyArray[i]];
            if (!j) tmp[keyArray[i]] = {};
            tmp = tmp[keyArray[i]];
            i++;
        }
        tmp[keyArray[i]] = value;
    });
    array.length && result.push(obj);
    return result;
}

var str = "type=line&areaStyle.show=true&lineStyle.normal.color=#000&lineStyle.normal.width=2&type=bar&areaStyle.show=false&lineStyle.normal.color=#fff&lineStyle.normal.width=3";

formatter(str);

思路:
1.先以根据”type“分割数据,a = [type1, type2, type3...]
2.对type1根据 ”&“分割数据,b = [&1, &2, &3...]
3.然后再对&1分割的一条键值对根据"="分割, key=value
4.检测key中是否含有".",根据不同情况进行格式化, 是一个普通对象,还是嵌套的对象。
重复3,4直到b数组中数据处理完。回到1,处理type2,以此类推。

第4步,一个思路,拼成JSON字符串再解析:

var str = "lineStyle.normal.color=#000";
function format4(str) {
    var arr = str.split("=");
// 这里将值都转成了字符串;可另写对数字和布尔值和空值时的处理
    var val = '\"\:\"' + arr[1] + "\"" ;
    var keys = arr[0];
    var end = "}";
    var res = keys.replace(/\./g, function() {
        end += "}"
        return "\":{\""
    });
    res = "{\"" + res + val + end;
    return JSON.parse(res);
}
format4(str)

你这里 4 个属性,如果每个属性3个值,组合出来就 81 个对象……所以,首先确定这个需求有没有问题?

至于方法,就是把不同的值都分别列出来,然后做一个组合

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题