| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367 | //json综述。此类主要处理以下两种情况的数据。//1、后台返回的数据形如:{"id":"1","name":"zhangsan"}  称为json数据,在js中称为对象。//  元素Elements,包括div,a,input等在前端的表现形式是:{"tagname":"input","className":""}//                                                        {"tagname":"div","className":""}//2、[//     {"id":"1","name":"zhangsan"}//     {"id":"2","name":"lisi"}//  ]////综上所述,前端元素,数据基本都是{}.所以本数据处理类是针对前端所有对象。//#region 这里是json操作区域Namespace.register("U.Json");//兼容JSONU.Json.init = function () {    if (!window.JSON) {        window.JSON = {            stringify: U.Json.stringify,            parse: U.Json.parse        };    }}//JSON类操作,如果不存在json类,则自己创建一个window.JSON。只有一个地方使用了此函数的parse方法U.Json.stringify = function (json) {//转化成字符串    return U.UF.C.jsonToStr(json);}U.Json.parse = function (str) {//转化成实体    return str.parseJSON();}/*** 判断数据是否符合条件** @param  {object || array} 被添加的json对象或者数组* * @param  {object} 比较的对象* * @return  {object} 比较的对象*/U.Json.ifExists = function (key1, key2) {    if (key2 === key1) {        return true;    }    for (var i in key1) {        if (key1[i] != key2[i]) {            return false;        }    }    return true;}//#region json对象处理类,处理类似下面的json数据/*{"_id" : ObjectId("532eab25aa01ee01e2297676"),"UserID" : "83ddf636-7266-4d15-be11-a7ef89bcac55","TNode" : [{"Name" : "根目录","CreateDate" : ISODate("2014-03-23T09:36:37.376Z"),"Type" : "folder","ID" : "e6f3963e-6087-b772-8e54-561353832f7b","Deep" : 1.0,"IsDelete" : false,"TNode" : [{"Name" : "Test","CreateDate" : ISODate("2014-03-23T09:36:43.526Z"),"Type" : "folder","ID" : "0fb91d00-7c5b-dd79-4f3e-1c2d405611e2","IsDelete" : false,"Deep" : 2.0,"TNode" : [{"Name" : "index.htm","CreateDate" : ISODate("2014-03-23T09:36:43.548Z"),"Type" : "file","ID" : "929bb945-ca3b-dedd-7077-88d1ce0492e3","IsDelete" : false,"Deep" : 3.0,"Content" : ""}],"IsPublic" : true}]}]}*//*** 添加json对象** @param  {object || array} 被添加的json对象或者数组* * @param  {object} 需要添加的对象值* * @return  {object} 返回添加后新的对象值实例一var a = [{username:"a"},{username:"b"},{username:"c"}];var b = {test:'1'}U.Json.add(a,b);    实例二var a = {username:"cxs"}var b = {id:'1'}U.Json.add(a,b);*/U.Json.add = function (obj1, obj2) {    var i; //循环初始值    //判断参数obj1是否为对象或者数组,如果是对象,循环添加。    if (!Array.isArray(obj1)) {//判断是否为数组        for (i in obj2) {//循环参数obj2对象            obj1[i] = obj2[i]; //对参数obj1赋值        }    }    //如果参数obj1是数组,为数组中的每一个对象都添加赋值    else {        for (i = 0; i < obj1.length; i++) {//循环obj1数组            U.UF.C.AddObj(obj1[i], obj2); //为数组中的每一个对象元素都添加对象obj2的值。        }    }    //返回添加后新的对象值    return obj1;}//少一个跨层搜索的方法。//obj json格式 为类似mongodb中的数据,//key 字符串 是关键字//value 字符串 是值U.Json.find = function (obj, key, value) {}//#endregion//#region 处理jsonArray的数据,实质是数组/*** 根据条件,删除json数组中指定的json** @param  {array} 被删除的json数组。* * @param  {object} 删除json的数据。* * @return  {object} 返回的删除数据。            实例一var a = [{parentid:1, username:"a"},{parentid:1,username:"b"},{parentid:2,username:"c"}]var b = {parentid:2,username:"c"}U.Json.delete(a,b);*/U.Json.del = function (obj, key, data) { //删除 允许递归    data = data || obj; //传递进来的json数据    var i,        _deldata,        _delarray = []; //返回的删除数据。    //数组删除指定obj条件的元素    if (Array.isArray(data)) {//数组使用        for (i = 0; i < data.length; i++) {            //循环删除 获取移除的元素            _deldata = U.Json.del(obj, key, data[i]);            if (_deldata.length) { //判断是否移除了元素,length大于0相当于移除超过一个元素。                data.splice(i, 1); //数组的系统移除方法                _delarray = _delarray.concat(_deldata); //把移除的元素添加到变量中                i--; //由于上面用了循环i++ 移除元素后 数组的下标减一了,所以这里用i--让i回到前面一个循环,这样即使数组删除了一个元素也不会直接跳过下一个元素的循环            }        }    }    else if (typeof data == "object") { //对象删除        if (U.Json.ifExists(key, data)) {            delete data;            _delarray.push(data);        }        else if (key === true) { //递归删除            for (i in data) {                _deldata = U.Json.del(obj, key, data[i]); //递归删除该数据                _delarray = _delarray.concat(_deldata); //把删除的数据追加到变量中            }        }        else if (key && data[key]) { //根据指定的key进行递归删除            _deldata = U.Json.del(obj, key, data[key]); //根据指定的key递归删除该数据            _delarray = data.concat(_deldata);        }    }    return _delarray;}/*** 根据条件,查找json数组中指定的json** @param  {array} 需要进行选择的json数组。* * @param  {object} 选择的条件** @param  {number} 选择的个数* * @return  {array} 选择后的结果实例一var a = [{ parentid: 1, username: "a" }, { parentid: 1, username: "b" }, { parentid: 2, username: "c" }]var b = { parentid: 1 }U.Json.select(a,b,2);*/U.Json.select = function (arr, obj, num) {//条件获取    var i, //判断初始化        _bool, //用于参数判断        _res = []; //用于存放选择后的结果    //判断需要选择的对象是否为数组                if (Array.isArray(arr)) {        //循环json数组        for (i = 0; i < arr.length; i++) {            //设置判断默认值            _bool = true;            //循环条件            for (var j in obj) {                //如果是其中有一个条件不符合要求,修改判断值。                if (arr[i][j] != obj[j]) {                    _bool = false;                }            }            //如果所有的条件都成立,则记录数组            if (_bool) {                _res.push(arr[i]);            }            //判断程序选择的个数是否大于用户的选择个数,如果大于选择个数,跳出循环            if (_res.length == num) {                break;            };        }    }    //返回结果集    return _res;}/*** 根据条件,查找json数组中指定的json,只获取一个结果集** @param  {array} 需要进行选择的json数组。* * @param  {object} 选择的条件* * @return  {array} 选择后的结果            实例一var a = [{ parentid: 1, username: "a" }, { parentid: 1, username: "b" }, { parentid: 2, username: "c" }]var b = { parentid: 1 }U.Json.selectOne(a,b);*/U.Json.selectOne = function (arr, obj) {    return (U.Json.select(arr, obj, 1))[0];}/*** 根据条件,对json数组进行排序,此函数需要移动到数组中。** @param  {array} 需要进行选择的json数组。 * @param  {number} 排序方式 1正序 -1倒序* @return  {string} 排序的条件,json数组中的键名  实例一var a = [{id:3},{id:1},{id:2}]; U.Json.sort(a,"id");*/U.Json.sort = function (arr, key, isreverse) { //排序    isreverse = isreverse || 1;    //采用数组本身的排序sort方法,此方法比较奇特。    arr = arr.sort(function (obj1, obj2) {        var _value,            _type, //比较大小的类型            _value1 = obj1[key],            _value2 = obj2[key],            _isobj = U.UF.C.isObject(obj1); //判断比较的大小是否为对象        //对象的大小匹配        if (_isobj) {            _type = (typeof (obj1[key] || obj2[key])).capitalizeFirstLetter(); //由于类型的值有可能是null或者是undefined,判断两种比较安全        }        //非对象的处理方式 U.UF.Ut.compare+type 是一些列的对象比较大小的方法        else {            _type = (typeof obj1).capitalizeFirstLetter();        }        //数字大小比较          if (_type == "Number") {            _value = _value1 > _value2;        }        //时间大小比较        else if (_type == "Date") {            _value = U.UF.D.SizeComparison(_value1, _value2);        }        //字符串大小比较        else if (_type == "String") {            _value = _value1.localeCompare(_value2) == 1;        }        //服务器的值可能是null,没有类型比较默认第一个比第二个大        else {            _value = true;        }        //isreverse 用于判断倒序还是正序,如果是-1就是倒序,如果是1就是正序,需要返回这个值给数组的sort函数,比较奇特        _value = isreverse * (_value ? 1 : -1);        return _value;    });    return arr;}/*** 根据条件,对json数组进行排序,此函数注释有问题** @param  {array} obj数组* @param  {string} 关键字 */U.Json.toKeyArray = function (arr, key) {    var i,        _returnarr = []; //数组存储数据    //循环写入数据    for (i = 0; i < arr.length; i++) {        _returnarr.push(arr[i][key]);    }    //返回数组    return _returnarr;}/*** 根据条件,对json数组进行排序,此函数注释有问题** @param  {array} obj数组* @param  {object} key value的条件 * @param  {number} 关键字 */U.Json.like = function (arr, obj, num) {    var i, //判断初始化        _bool, //用于参数判断        _res = []; //用于存放选择后的结果    //判断需要选择的对象是否为数组                if (Array.isArray(arr)) {        //循环json数组        for (i = 0; i < arr.length; i++) {            //设置判断默认值            _bool = false;            //循环条件            for (var j in obj) {                //如果是其中有一个条件不符合要求,修改判断值。                if (arr[i][j] && (arr[i][j].indexOf(obj[j]) > -1 || obj[j].indexOf(arr[i][j]) > -1)) {                    _bool = true;                }            }            //如果所有的条件都成立,则记录数组            if (_bool) {                _res.push(arr[i]);            }            //判断程序选择的个数是否大于用户的选择个数,如果大于选择个数,跳出循环            if (_res.length == num) {                break;            };        }        //返回结果集        return _res;    }}//#endregion
 |