基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)


Posted in Javascript onDecember 28, 2015

表单序列化类型的数据是指url传递的数据的格式,形如"key=value&key=value&key=value"这样的key/value的键值对。一般来说使用jQuery的$.fn.serialize函数能达到这样的效果。如何将这样的格式转化为对象?

我们知道使用jQuery的$.fn.serializeArray函数得到的是一个如下结构的对象

[
  {
    name: "startTime"
    value: "2015-12-02 00:00:00"
  },
  {
    name: "endTime"
    value: "2015-12-25 23:59:59"
  }
]

这是一个对象数组,但有时候我们希望得到的是如下结构的对象

{
  "startTime": "2015-12-02 00:00:00"
  "endTime": "2015-12-25 23:59:59"
}

所以这里需要一个转化函数。

处理步骤如下:

1.使用"&"分隔将每一个键值对分开然后循环处理每一个键值对

var properties = serializedParams.split("&");
  for (var i = 0; i < properties.length; i++) {
    //处理每一个键值对
    evalThem(properties[i]);
  };

2.从"="符号切分指定的键值对,并对每个键和值使用decodeURIComponent解析uri 组件编码(因为url传递的序列化数据一般都是经过uri组件编码的)

var strAry = new Array();
    strAry = str.split("=");
    //使用decodeURIComponent解析uri 组件编码
    for(var i = 0; i < strAry.length; i++){
      strAry[i] = decodeURIComponent(strAry[i]);
    }
    var attributeName = strAry[0];
    var attributeValue = strAry[1].trim();

3.如果值包含"="符号,需要额外处理(值合并)。       

if(strAry.length > 2){
      for(var i = 2;i<strAry.length;i++){
        attributeValue += "="+strAry[i].trim();
      }
    }

这里面有一个处理,就是值没有的时候就不会往最终对象里面添加。这个可以根据自己的情况选择删除这段代码与否

if(!attributeValue){
      return ;
    }

4.如果键是“obj.obj.obj”这种由"."符号链接的,需要将它作为对象包含对象来处理。处理的方法是将键通过"."分解,然后去查看临时对象obj中是否已经包含分解出来的对象,如果是则将数据附加到已有的对象上。源码如下  

var attriNames = attributeName.split("."),
      curObj = obj;
    for(var i = 0; i < (attriNames.length - 1); i++){
      curObj[attriNames[i]]?"":(curObj[attriNames[i]] = {});
      curObj = curObj[attriNames[i]];
    }
    curObj[attriNames[i]] = attributeValue.trim();

这里面我们看到网上有对赋值部分是这么处理的

eval("obj."+attributeName+"=\""+attributeValue.trim()+"\";");

这个很有问题,一个是不能正确处理4中对象包含对象的问题(尤其是有两个元素拥有同一个父对象的时候,比如"test.id=1&test.name='chua'"都拥有父对象test)。另外一个就是值attributeValue中包含单引号、双引号时无法正确处理。所以使用赋值"="最保险。

所以最终完整的源码如下

/*
serializedParams格式为"key1=value1&key2=value2". 
也支持'key.sonkey=value' 
 */
function paramString2obj (serializedParams) {  
  var obj={};
  function evalThem (str) {
    var strAry = new Array();
    strAry = str.split("=");
    //使用decodeURIComponent解析uri 组件编码
    for(var i = 0; i < strAry.length; i++){
      strAry[i] = decodeURIComponent(strAry[i]);
    }
    var attributeName = strAry[0];
    var attributeValue = strAry[1].trim();
    //如果值中包含"="符号,需要合并值
    if(strAry.length > 2){
      for(var i = 2;i<strAry.length;i++){
        attributeValue += "="+strAry[i].trim();
      }
    }
    if(!attributeValue){
      return ;
    }
    var attriNames = attributeName.split("."),
      curObj = obj;
    for(var i = 0; i < (attriNames.length - 1); i++){
      curObj[attriNames[i]]?"":(curObj[attriNames[i]] = {});
      curObj = curObj[attriNames[i]];
    }
    //使用赋值方式obj[attributeName] = attributeValue.trim();替换
    //eval("obj."+attributeName+"=\""+attributeValue.trim()+"\";");
    //解决值attributeValue中包含单引号、双引号时无法处理的问题
    curObj[attriNames[i]] = attributeValue.trim();
  };
  var properties = serializedParams.split("&");
  for (var i = 0; i < properties.length; i++) {
    //处理每一个键值对
    evalThem(properties[i]);
  };
  return obj;
}

以上内容是基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象),希望本文分享能够给大家带来帮助。

Javascript 相关文章推荐
JS提交并解析后台返回的XML的代码
Nov 03 Javascript
Javascript匿名函数的一种应用 代码封装
Jun 27 Javascript
jQuery中:gt选择器用法实例
Dec 29 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
Jun 04 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
Oct 31 Javascript
JS操作COOKIE实现备忘记录的方法
Apr 01 Javascript
vue如何从接口请求数据
Jun 22 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
May 22 jQuery
vue.js实现带日期星期的数字时钟功能示例
Aug 28 Javascript
Vue.js样式动态绑定实现小结
Jan 24 Javascript
Electron整合React使用搭建开发环境的步骤详解
Jun 07 Javascript
koa中间件核心(koa-compose)源码解读分析
Jun 15 Javascript
浅析JS运动
Dec 28 #Javascript
基于JavaScript实现网页倒计时自动跳转代码
Dec 28 #Javascript
js时间戳转为日期格式的方法
Dec 28 #Javascript
jquery实现全屏滚动
Dec 28 #Javascript
AngularJS使用angular-formly进行表单验证
Dec 27 #Javascript
延时加载JavaScript代码提高速度
Dec 27 #Javascript
AngularJS使用ngMessages进行表单验证
Dec 27 #Javascript
You might like
解析php时间戳与日期的转换
2013/06/06 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
2014/08/20 PHP
php提交post数组参数实例分析
2015/12/17 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
一个网马的tips实现分析
2010/11/28 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
微信小程序实现限制用户转发功能的实例代码
2020/02/22 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
python 文件和路径操作函数小结
2009/11/23 Python
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
Python注释详解
2016/06/01 Python
python高级特性简介
2020/08/13 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
大学本科生的个人自我评价
2013/12/09 职场文书
暑期教师培训方案
2014/06/07 职场文书
国贸专业毕业求职信
2014/06/11 职场文书
车贷收入证明范本
2014/09/14 职场文书
停车场管理协议书范本
2014/10/08 职场文书
傅雷家书读书笔记
2015/06/29 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
安全生产奖惩制度
2015/08/06 职场文书
教务处干事工作总结
2015/08/14 职场文书
Java的Object类的九种方法
2022/04/13 Java/Android
Windows server 2012搭建FTP服务器
2022/04/29 Servers