jquery如何更好操作json数据
hi,我在写一个购物车,功能实现时,无论数据库存储还是页面数据操作的存储都用了json数据格式,但每次增减商品操作的时候都需要将json转换为数据,然后再转换回来,自己读起来都晕了,请问有什么更有效的操作json数据的方法,或者更好的购物车实现方法,谢谢
完善一下问题:
我的对象是一个多维数组的形态,大概如下,{}表示一个单独的对象,就不详细写了
我需要的功能是
1、对{}这样的对象进行增删操作,修改此对象的内容;
2、直接增删'99':[{},{},{},{},{}]这样对象数组。
查了不少资料,好象没看到有直接操作对象增删的方法
$.tranResArrayJsonStr = function(mycart){
var jsonstr = '';
if(typeof(mycart) == 'undefined') {return '';}
if(mycart.length>0 && mycart.constructor==Array){
jsonstr = '{';
for(var i=0; i<mycart.length; i++){
if (mycart[i].constructor==Array && mycart[i].length>0){
jsonstr = jsonstr+'"'+mycart[i][0]+'":[';
for(var x=1; x<mycart[i].length; x++){
if(x==(mycart[i].length)-1){
jsonstr = jsonstr+mycart[i][x];
}else{
jsonstr = jsonstr+mycart[i][x]+',';
}
}
jsonstr = jsonstr+']';
}
if(i==(mycart.length)-1){
jsonstr = jsonstr;
}else{
jsonstr = jsonstr+',';
}
}
jsonstr = jsonstr+'}';
}
return jsonstr;
}
$.tranJsonStrResArr = function(jsonstr){
var newcart=new Array();
if(typeof(jsonstr) == 'undefined') {return newcart;}
if(jsonstr.length < 10 ){return newcart;}
var cartobj = jQuery.parseJSON(jsonstr);
$.each(cartobj, function(i, n){
$.each(n,function(x,v){
//alert(i+n[x].name+n[x].price);
var thedish = '';
thedish = '{'+
'"resId":'+n[x].resId+','+
'"resName":"'+n[x].resName+'",'+
'"resTel":"'+n[x].resTel+'",'+
'"id":'+n[x].id+','+
'"name":"'+n[x].name+'",'+
'"price":'+n[x].price+','+
'"count":'+n[x].count+
'}';
if(newcart.length==0){
var tmpres = [n[x].resId,thedish];
newcart.push(tmpres);
}else{
var tag = 1;
var i = 0;
for (i in newcart)
{
if(newcart[i][0]==n[x].resId){
newcart[i].push(thedish);
tag = 0;
}
}
if(tag==1){
var tmpres = [n[x].resId,thedish];
newcart.push(tmpres);
}
}
});
});
return newcart;
}
$.changeCount = function(myhandle,action){
var resId = myhandle.attr("data-resid");
var dishid = myhandle.attr("data-id");
var curcartobj = jQuery.parseJSON(g_jsoncart);
var resdtag=0;
var resdtagid=0;
var dnum=0;
var dtag=0;
$.each(curcartobj, function(i, n){
var resdishnum=n.length;
if(i==resId){
$.each(n,function(x,v){
if(v.id == dishid && action == 1){
v.count = v.count+1;
}
if(v.id == dishid && action == 0){
if(v.count<2){
dnum=x;
dtag=1;
}else{
v.count = v.count-1;
}
}
});
if(dtag==1){
if(resdishnum<2){
resdtag=1;
resdtagid=i;
}else{
n.splice(dnum,1);
}
}
}
});
if(resdtag==1){
g_jsoncart = $.tranObjectJsonStr(curcartobj);
var dresArr = $.tranJsonStrResArr(g_jsoncart);
for (i in dresArr)
{
if(dresArr[i][0]==resdtagid){
dresArr.splice(i,1);
}
}
g_jsoncart = $.tranResArrayJsonStr(dresArr);
}else{
g_jsoncart = $.tranObjectJsonStr(curcartobj);
}
$.showCartHtml($.makeCartHtml(g_jsoncart));
$.cookie('mysite',g_jsoncart);
//$.cartSetAjax(g_jsoncart);
}
卡斯特梅D雨季
12 years, 6 months ago
Answers
直接建立对象,用就行了:
<SCRIPT LANGUAGE="JavaScript">
<!--
var mycart = {'resId':'','resName':'','resTel':'','id':'','name':'','price':'','count':''};
//设置各属性
mycart.resId = 'XXXX';
mycart.resName = 'XXXX';
mycart.resTel = 'XXXX';
mycart.id = 'XXXX';
mycart.name = 'XXXX';
mycart.price = 123;
mycart.count = 4;
//遍历对象
for(var i in mycart)
{
alert(i+'=>'+mycart[i])
}
//-->
</SCRIPT>
针对复杂的数据结构:
var ShoppingCart = {
'10':[{},{},{}],
'99':[{},{},{},{},{}],
'2341':[{}]
};
//对最里层对象修改,增删操作
ShoppingCart['10'][1].id = 123;
ShoppingCart['10'].push({'1':'2'});
ShoppingCart['10'][3]['1'] = undefined;
//增删'99':[{},{},{},{},{}]对象数组
ShoppingCart['99'].push({'1':'2'});
ShoppingCart['99'].splice(1,1);
如果完全使用对象,操作会更方便:
还需要你根据具体需求优化数据结构,最好不要用这么复杂的,可以自定义一个类,将增删改、计算子对象个数的方法都封装起来,使用时,生成新对象就行
杯具泡参D囧飛
answered 12 years, 6 months ago