我在写一个购物车,功能实现时,无论数据库存储还是页面数据操作的存储都用了json数据格式,但每次增减商品操作的时候都需要将json转换为数据,然后再转换回来,自己读起来都晕了,请问有什么更有效的操作json数据的方法,或者更好的购物车实现方法,谢谢


完善一下问题:

我的对象是一个多维数组的形态,大概如下,{}表示一个单独的对象,就不详细写了


{

'10':[{},{},{}],

'99':[{},{},{},{},{}],

'2341':[{}]

}


我需要的功能是

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); }
2010-12-29 11:44:59

4 Answers

jq 有个json插件 能够使用 类似查找节点 使用xpath 来操作 json数据;

另外还有个插件 能够将json 数据 渲染成 html 模版

2010-12-29 15:39:51

json在js就是一个object,可以直接操作的,你这样拼字符串不合适。

2010-12-29 16:55:31

数据库存储就不要用json串了。。数据库该怎么存就怎么存,方便增,删,改 就可以了。。
页面显示,直接从数据库取到符合条件的记录,(肯定是数组或对象)再转成json就可以了。
页面处理json只用于显示。增,删,改都是通过直接操作数据库,不需要在页面上增加,删除, 修改等操作在去拼 json格式的字符串。再入库。

2010-12-29 18:41:04
直接建立对象
<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); 
如果完全使用对象,操作会更方便:
var ShoppingCart = { '10':{0:{},1:{},2:{}}, '99':{0:{},1:{},2:{},3:{},4:{}}, '2341':{0:{}} };
还需要你根据具体需求优化数据结构,最好不要用这么复杂的,可以自定义一个类,将增删改、计算子对象个数的方法都封装起来,使用时,生成新对象就行
2010-12-29 13:38:27
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作