Json.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. 
  2. //json综述。此类主要处理以下两种情况的数据。
  3. //1、后台返回的数据形如:{"id":"1","name":"zhangsan"} 称为json数据,在js中称为对象。
  4. // 元素Elements,包括div,a,input等在前端的表现形式是:{"tagname":"input","className":""}
  5. // {"tagname":"div","className":""}
  6. //2、[
  7. // {"id":"1","name":"zhangsan"}
  8. // {"id":"2","name":"lisi"}
  9. // ]
  10. //
  11. //综上所述,前端元素,数据基本都是{}.所以本数据处理类是针对前端所有对象。
  12. //#region 这里是json操作区域
  13. Namespace.register("U.Json");
  14. //兼容JSON
  15. U.Json.init = function () {
  16. if (!window.JSON) {
  17. window.JSON = {
  18. stringify: U.Json.stringify,
  19. parse: U.Json.parse
  20. };
  21. }
  22. }
  23. //JSON类操作,如果不存在json类,则自己创建一个window.JSON。只有一个地方使用了此函数的parse方法
  24. U.Json.stringify = function (json) {//转化成字符串
  25. return U.UF.C.jsonToStr(json);
  26. }
  27. U.Json.parse = function (str) {//转化成实体
  28. return str.parseJSON();
  29. }
  30. /**
  31. * 判断数据是否符合条件
  32. *
  33. * @param {object || array} 被添加的json对象或者数组
  34. *
  35. * @param {object} 比较的对象
  36. *
  37. * @return {object} 比较的对象
  38. */
  39. U.Json.ifExists = function (key1, key2) {
  40. if (key2 === key1) {
  41. return true;
  42. }
  43. for (var i in key1) {
  44. if (key1[i] != key2[i]) {
  45. return false;
  46. }
  47. }
  48. return true;
  49. }
  50. //#region json对象处理类,处理类似下面的json数据
  51. /*{
  52. "_id" : ObjectId("532eab25aa01ee01e2297676"),
  53. "UserID" : "83ddf636-7266-4d15-be11-a7ef89bcac55",
  54. "TNode" : [{
  55. "Name" : "根目录",
  56. "CreateDate" : ISODate("2014-03-23T09:36:37.376Z"),
  57. "Type" : "folder",
  58. "ID" : "e6f3963e-6087-b772-8e54-561353832f7b",
  59. "Deep" : 1.0,
  60. "IsDelete" : false,
  61. "TNode" : [{
  62. "Name" : "Test",
  63. "CreateDate" : ISODate("2014-03-23T09:36:43.526Z"),
  64. "Type" : "folder",
  65. "ID" : "0fb91d00-7c5b-dd79-4f3e-1c2d405611e2",
  66. "IsDelete" : false,
  67. "Deep" : 2.0,
  68. "TNode" : [{
  69. "Name" : "index.htm",
  70. "CreateDate" : ISODate("2014-03-23T09:36:43.548Z"),
  71. "Type" : "file",
  72. "ID" : "929bb945-ca3b-dedd-7077-88d1ce0492e3",
  73. "IsDelete" : false,
  74. "Deep" : 3.0,
  75. "Content" : ""
  76. }],
  77. "IsPublic" : true
  78. }]
  79. }]
  80. }*/
  81. /**
  82. * 添加json对象
  83. *
  84. * @param {object || array} 被添加的json对象或者数组
  85. *
  86. * @param {object} 需要添加的对象值
  87. *
  88. * @return {object} 返回添加后新的对象值
  89. 实例一
  90. var a = [{username:"a"},{username:"b"},{username:"c"}];
  91. var b = {test:'1'}
  92. U.Json.add(a,b);
  93. 实例二
  94. var a = {username:"cxs"}
  95. var b = {id:'1'}
  96. U.Json.add(a,b);
  97. */
  98. U.Json.add = function (obj1, obj2) {
  99. var i; //循环初始值
  100. //判断参数obj1是否为对象或者数组,如果是对象,循环添加。
  101. if (!Array.isArray(obj1)) {//判断是否为数组
  102. for (i in obj2) {//循环参数obj2对象
  103. obj1[i] = obj2[i]; //对参数obj1赋值
  104. }
  105. }
  106. //如果参数obj1是数组,为数组中的每一个对象都添加赋值
  107. else {
  108. for (i = 0; i < obj1.length; i++) {//循环obj1数组
  109. U.UF.C.AddObj(obj1[i], obj2); //为数组中的每一个对象元素都添加对象obj2的值。
  110. }
  111. }
  112. //返回添加后新的对象值
  113. return obj1;
  114. }
  115. //少一个跨层搜索的方法。
  116. //obj json格式 为类似mongodb中的数据,
  117. //key 字符串 是关键字
  118. //value 字符串 是值
  119. U.Json.find = function (obj, key, value) {
  120. }
  121. //#endregion
  122. //#region 处理jsonArray的数据,实质是数组
  123. /**
  124. * 根据条件,删除json数组中指定的json
  125. *
  126. * @param {array} 被删除的json数组。
  127. *
  128. * @param {object} 删除json的数据。
  129. *
  130. * @return {object} 返回的删除数据。
  131. 实例一
  132. var a = [{parentid:1, username:"a"},{parentid:1,username:"b"},{parentid:2,username:"c"}]
  133. var b = {parentid:2,username:"c"}
  134. U.Json.delete(a,b);
  135. */
  136. U.Json.del = function (obj, key, data) { //删除 允许递归
  137. data = data || obj; //传递进来的json数据
  138. var i,
  139. _deldata,
  140. _delarray = []; //返回的删除数据。
  141. //数组删除指定obj条件的元素
  142. if (Array.isArray(data)) {//数组使用
  143. for (i = 0; i < data.length; i++) {
  144. //循环删除 获取移除的元素
  145. _deldata = U.Json.del(obj, key, data[i]);
  146. if (_deldata.length) { //判断是否移除了元素,length大于0相当于移除超过一个元素。
  147. data.splice(i, 1); //数组的系统移除方法
  148. _delarray = _delarray.concat(_deldata); //把移除的元素添加到变量中
  149. i--; //由于上面用了循环i++ 移除元素后 数组的下标减一了,所以这里用i--让i回到前面一个循环,这样即使数组删除了一个元素也不会直接跳过下一个元素的循环
  150. }
  151. }
  152. }
  153. else if (typeof data == "object") { //对象删除
  154. if (U.Json.ifExists(key, data)) {
  155. delete data;
  156. _delarray.push(data);
  157. }
  158. else if (key === true) { //递归删除
  159. for (i in data) {
  160. _deldata = U.Json.del(obj, key, data[i]); //递归删除该数据
  161. _delarray = _delarray.concat(_deldata); //把删除的数据追加到变量中
  162. }
  163. }
  164. else if (key && data[key]) { //根据指定的key进行递归删除
  165. _deldata = U.Json.del(obj, key, data[key]); //根据指定的key递归删除该数据
  166. _delarray = data.concat(_deldata);
  167. }
  168. }
  169. return _delarray;
  170. }
  171. /**
  172. * 根据条件,查找json数组中指定的json
  173. *
  174. * @param {array} 需要进行选择的json数组。
  175. *
  176. * @param {object} 选择的条件
  177. *
  178. * @param {number} 选择的个数
  179. *
  180. * @return {array} 选择后的结果
  181. 实例一
  182. var a = [{ parentid: 1, username: "a" }, { parentid: 1, username: "b" }, { parentid: 2, username: "c" }]
  183. var b = { parentid: 1 }
  184. U.Json.select(a,b,2);
  185. */
  186. U.Json.select = function (arr, obj, num) {//条件获取
  187. var i, //判断初始化
  188. _bool, //用于参数判断
  189. _res = []; //用于存放选择后的结果
  190. //判断需要选择的对象是否为数组
  191. if (Array.isArray(arr)) {
  192. //循环json数组
  193. for (i = 0; i < arr.length; i++) {
  194. //设置判断默认值
  195. _bool = true;
  196. //循环条件
  197. for (var j in obj) {
  198. //如果是其中有一个条件不符合要求,修改判断值。
  199. if (arr[i][j] != obj[j]) {
  200. _bool = false;
  201. }
  202. }
  203. //如果所有的条件都成立,则记录数组
  204. if (_bool) {
  205. _res.push(arr[i]);
  206. }
  207. //判断程序选择的个数是否大于用户的选择个数,如果大于选择个数,跳出循环
  208. if (_res.length == num) {
  209. break;
  210. };
  211. }
  212. }
  213. //返回结果集
  214. return _res;
  215. }
  216. /**
  217. * 根据条件,查找json数组中指定的json,只获取一个结果集
  218. *
  219. * @param {array} 需要进行选择的json数组。
  220. *
  221. * @param {object} 选择的条件
  222. *
  223. * @return {array} 选择后的结果
  224. 实例一
  225. var a = [{ parentid: 1, username: "a" }, { parentid: 1, username: "b" }, { parentid: 2, username: "c" }]
  226. var b = { parentid: 1 }
  227. U.Json.selectOne(a,b);
  228. */
  229. U.Json.selectOne = function (arr, obj) {
  230. return (U.Json.select(arr, obj, 1))[0];
  231. }
  232. /**
  233. * 根据条件,对json数组进行排序,此函数需要移动到数组中。
  234. *
  235. * @param {array} 需要进行选择的json数组。
  236. * @param {number} 排序方式 1正序 -1倒序
  237. * @return {string} 排序的条件,json数组中的键名
  238. 实例一
  239. var a = [{id:3},{id:1},{id:2}];
  240. U.Json.sort(a,"id");
  241. */
  242. U.Json.sort = function (arr, key, isreverse) { //排序
  243. isreverse = isreverse || 1;
  244. //采用数组本身的排序sort方法,此方法比较奇特。
  245. arr = arr.sort(function (obj1, obj2) {
  246. var _value,
  247. _type, //比较大小的类型
  248. _value1 = obj1[key],
  249. _value2 = obj2[key],
  250. _isobj = U.UF.C.isObject(obj1); //判断比较的大小是否为对象
  251. //对象的大小匹配
  252. if (_isobj) {
  253. _type = (typeof (obj1[key] || obj2[key])).capitalizeFirstLetter(); //由于类型的值有可能是null或者是undefined,判断两种比较安全
  254. }
  255. //非对象的处理方式 U.UF.Ut.compare+type 是一些列的对象比较大小的方法
  256. else {
  257. _type = (typeof obj1).capitalizeFirstLetter();
  258. }
  259. //数字大小比较
  260. if (_type == "Number") {
  261. _value = _value1 > _value2;
  262. }
  263. //时间大小比较
  264. else if (_type == "Date") {
  265. _value = U.UF.D.SizeComparison(_value1, _value2);
  266. }
  267. //字符串大小比较
  268. else if (_type == "String") {
  269. _value = _value1.localeCompare(_value2) == 1;
  270. }
  271. //服务器的值可能是null,没有类型比较默认第一个比第二个大
  272. else {
  273. _value = true;
  274. }
  275. //isreverse 用于判断倒序还是正序,如果是-1就是倒序,如果是1就是正序,需要返回这个值给数组的sort函数,比较奇特
  276. _value = isreverse * (_value ? 1 : -1);
  277. return _value;
  278. });
  279. return arr;
  280. }
  281. /**
  282. * 根据条件,对json数组进行排序,此函数注释有问题
  283. *
  284. * @param {array} obj数组
  285. * @param {string} 关键字
  286. */
  287. U.Json.toKeyArray = function (arr, key) {
  288. var i,
  289. _returnarr = []; //数组存储数据
  290. //循环写入数据
  291. for (i = 0; i < arr.length; i++) {
  292. _returnarr.push(arr[i][key]);
  293. }
  294. //返回数组
  295. return _returnarr;
  296. }
  297. /**
  298. * 根据条件,对json数组进行排序,此函数注释有问题
  299. *
  300. * @param {array} obj数组
  301. * @param {object} key value的条件
  302. * @param {number} 关键字
  303. */
  304. U.Json.like = function (arr, obj, num) {
  305. var i, //判断初始化
  306. _bool, //用于参数判断
  307. _res = []; //用于存放选择后的结果
  308. //判断需要选择的对象是否为数组
  309. if (Array.isArray(arr)) {
  310. //循环json数组
  311. for (i = 0; i < arr.length; i++) {
  312. //设置判断默认值
  313. _bool = false;
  314. //循环条件
  315. for (var j in obj) {
  316. //如果是其中有一个条件不符合要求,修改判断值。
  317. if (arr[i][j] && (arr[i][j].indexOf(obj[j]) > -1 || obj[j].indexOf(arr[i][j]) > -1)) {
  318. _bool = true;
  319. }
  320. }
  321. //如果所有的条件都成立,则记录数组
  322. if (_bool) {
  323. _res.push(arr[i]);
  324. }
  325. //判断程序选择的个数是否大于用户的选择个数,如果大于选择个数,跳出循环
  326. if (_res.length == num) {
  327. break;
  328. };
  329. }
  330. //返回结果集
  331. return _res;
  332. }
  333. }
  334. //#endregion