【www.bbyears.com--js教程】
在用JSON传递数据时有一个问题,就是在传递列表时,字段名过于重复,浪费了带宽,降低了效率。比如:
代码如下{
data:[
{name:”张三”,idcard:””…},
{name:”李四”,idcard:””…}
]
}
数据有多少条,”name”和”idcard”这两个字符串就有多少套,那么是否可以简化一下?
在JSONP模式中只需要给一个方法传入数据,而这个数据不一定是直接的数据变量,在javascript里可以通过自调用匿名函数返回数据,所以可以把这个匿名函数当成入参传给这个方法:
代码如下SomeFunction( (function(){return data;})() );
对于客户端网页来说,只要传入的数据格式正确就可以,至于是数据还是函数返回值并不关注,但是对于服务器端,如果返回函数,就可以做很多事情,而且这些事情客户端是无法拒绝的(因为跨域),其中包括刚才讨论到的数据key冗余问题。
key冗余问题,最容易想到的就是将key抽取出来,在函数自执行的时候再拼回去,所以可以定义两个变量用于存key值和数据,再通过for循环拼装,代码如下:
代码如下
(function(){
var m=[“name”,”idcard”];//用于存key名
var d=[[“张三”,””],[“李四”,””]];//完全用于储存数据,没有key,没有浪费
var r={list:[]};//用于返回结果
for(var i=0;i r.list.push({}); for(var j=0;j r.list[i][m[j]]=d[i][j]; } };//将数据拼装回去 try{return r;}finally{}//返回客户端要的数据 })();//自执行 如果字段名都很短而且数据条数少的话,就不需要这么麻烦,直接返回数据就可以,当数据量较多,这种方式就比较实用了。 另外,在finally里面可以放额外的代码,比如: finally{alert(“虽然您访问的是163,但是数据是从baidu来的哦!”)} 显然163对此无能为力:)至于这里面放什么东西就取决于业务需要了。这种格式暂且称之为JSONPM吧(JSONP Metadata extraction)。