You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

354 lines
7.2 KiB

  1. -- 这里是扩充table的一些功能
  2. function table.nums(t)
  3. local count = 0
  4. for k, v in pairs(t) do
  5. count = count + 1
  6. end
  7. return count
  8. end
  9. function table.empty(t)
  10. for k, v in pairs(t) do
  11. return false;
  12. end
  13. return true;
  14. end
  15. function table.keys(t)
  16. local keys = {}
  17. for k, v in pairs(t) do
  18. keys[#keys + 1] = k
  19. end
  20. return keys
  21. end
  22. function table.values(t)
  23. local values = {}
  24. for k, v in pairs(t) do
  25. values[#values + 1] = v
  26. end
  27. return values
  28. end
  29. function table.merge(dest, src)
  30. for k, v in pairs(src) do
  31. dest[k] = v
  32. end
  33. end
  34. function table.mergeAll(src , dest)
  35. for k, v in pairs(src) do
  36. if type(v) == "table" then
  37. if not dest[k] then
  38. dest[k] = v;
  39. else
  40. table.mergeAll(v , dest[k]);
  41. end
  42. else
  43. dest[k] = v
  44. end
  45. end
  46. end
  47. function table.imerge(dest, src)
  48. for k, v in ipairs(src) do
  49. table.insert(dest , v)
  50. end
  51. end
  52. --[[--
  53. insert list.
  54. **Usage:**
  55. local dest = {1, 2, 3}
  56. local src = {4, 5, 6}
  57. table.insertTo(dest, src)
  58. -- dest = {1, 2, 3, 4, 5, 6}
  59. dest = {1, 2, 3}
  60. table.insertTo(dest, src, 5)
  61. -- dest = {1, 2, 3, nil, 4, 5, 6}
  62. @param table dest
  63. @param table src
  64. @param table begin insert position for dest
  65. ]]
  66. function table.insertTo(dest, src, begin)
  67. begin = tonumber(begin)
  68. if begin == nil then
  69. begin = #dest + 1
  70. end
  71. local len = #src
  72. for i = 0, len - 1 do
  73. dest[i + begin] = src[i + 1]
  74. end
  75. end
  76. --[[
  77. search target index at list.
  78. @param table list
  79. @param * target
  80. @param int from idx, default 1
  81. @param bool useNaxN, the len use table.maxn(true) or #(false) default:false
  82. @param return index of target at list, if not return -1
  83. ]]
  84. function table.indexOf(list, target, from, useMaxN)
  85. local len = (useMaxN and #list) or table.maxn(list)
  86. if from == nil then
  87. from = 1
  88. end
  89. for i = from, len do
  90. if list[i] == target then
  91. return i
  92. end
  93. end
  94. return -1
  95. end
  96. function table.indexOfKey(list, key, value, from, useMaxN)
  97. local len = (useMaxN and #list) or table.maxn(list)
  98. if from == nil then
  99. from = 1
  100. end
  101. local item = nil
  102. for i = from, len do
  103. item = list[i]
  104. if item ~= nil and item[key] == value then
  105. return i
  106. end
  107. end
  108. return -1
  109. end
  110. function table.removeItem(t, item, removeAll)
  111. for i = #t, 1, -1 do
  112. if t[i] == item then
  113. table.remove(t, i)
  114. if not removeAll then break end
  115. end
  116. end
  117. end
  118. function table.map(t, fun)
  119. for k,v in pairs(t) do
  120. t[k] = fun(v, k)
  121. end
  122. end
  123. function table.walk(t, fun)
  124. for k,v in pairs(t) do
  125. fun(v, k)
  126. end
  127. end
  128. function table.filter(t, fun)
  129. for k,v in pairs(t) do
  130. if not fun(v, k) then
  131. t[k] = nil
  132. end
  133. end
  134. end
  135. function table.find(t, item)
  136. return table.keyOfItem(t, item) ~= nil
  137. end
  138. function table.unique(t)
  139. local r = {}
  140. local n = {}
  141. for i = #t, 1, -1 do
  142. local v = t[i]
  143. if not r[v] then
  144. r[v] = true
  145. n[#n + 1] = v
  146. end
  147. end
  148. return n
  149. end
  150. function table.keyOfItem(t, item)
  151. for k,v in pairs(t) do
  152. if v == item then return k end
  153. end
  154. return nil
  155. end
  156. function table.valueOfItem(t, item)
  157. for k,v in pairs(t) do
  158. if v == item then return v end
  159. end
  160. return nil
  161. end
  162. -- 把表转换成类似这种格式的字符串{a='b';};,字符串用二进制格式表示"\01\02"之类
  163. function table.toString(t)
  164. local tableString = vardump(t , "");
  165. return tableString:sub(8);
  166. end
  167. -- 把表转换成类似这种格式的字符串{a='b';};,字符串用可见文本形式表示
  168. function table.tostring(t)
  169. if not t then
  170. return "nil"
  171. end
  172. local oldFunc = string.toLuaString;
  173. string.toLuaString = tostring;
  174. local tableString = vardump(t , "");
  175. string.toLuaString = oldFunc
  176. return tableString:sub(8);
  177. end
  178. -- 把表转换成类似这种格式的字符串return {a='b';};
  179. function table.saveString(t)
  180. return "return " .. table.toString(t);
  181. end
  182. -- 从字符串中载入一个表
  183. function table.loadString(tableString)
  184. local data , err = loadstring(tableString);
  185. if data == nil then
  186. print("table.loadString()", tostring(tableString))
  187. --error(err);
  188. uploadLogs(GAME_ERROR_TYPE.TABLELOADSTRING)
  189. return nil
  190. else
  191. return data();
  192. end
  193. end
  194. -- 将一个table数据保存到本地文件
  195. function table.saveToLocFile(t, filename)
  196. if not t or not filename then
  197. return
  198. end
  199. local tableString = table.saveString(t)
  200. saveStringToFile(tableString, filename)
  201. end
  202. -- 从本地文件读取一个table数据
  203. function table.loadFromLocFile(filename)
  204. if not filename then
  205. return
  206. end
  207. local tableString = loadStringFromFile(filename)
  208. if not tableString then
  209. return nil
  210. end
  211. return table.loadString(tableString)
  212. end
  213. -- 把表保存到文件中
  214. function table.saveFile(t , filename)
  215. local file , err = io.open(filename , "w");
  216. if file == nil then
  217. error(err);
  218. return;
  219. end
  220. file:write("return ")
  221. file:write(table.toString(t));
  222. file:close();
  223. end
  224. if EditorMode then
  225. -- 从文件中载入一个表
  226. function table.loadFile(filename)
  227. local n,r = loadLuaFile(filename);
  228. if n == nil then
  229. --error("载入文件" .. tostring(filename) .. "时出错" .. r);
  230. return nil
  231. end
  232. return n();
  233. end
  234. else
  235. -- 从文件中载入一个表
  236. local tableCache = {};
  237. function table.loadFile(filename)
  238. local cache = tableCache[filename];
  239. if cache then
  240. return cache;
  241. end
  242. print("table.loadFile:" .. filename);
  243. TimeSpan:enterSpan("table.loadFile:" .. filename);
  244. local n,r = loadLuaFile(filename);
  245. if n == nil then
  246. --error("载入文件" .. tostring(filename) .. "时出错" .. r);
  247. return nil
  248. end
  249. TimeSpan:enterSpan("runTable");
  250. cache = n();
  251. TimeSpan:leaveSpan();
  252. tableCache[filename] = cache;
  253. TimeSpan:leaveSpan();
  254. return cache;
  255. end
  256. end
  257. -- 兼容版本
  258. if not table.getn then
  259. function table.getn(t)
  260. return #t;
  261. end
  262. end
  263. local rawpairs = pairs
  264. -------------------------------------------
  265. -- 可以按指定顺序遍历的map迭代器
  266. -- @param tbl 要迭代的表
  267. -- @param func 比较函数
  268. -- @example
  269. -- for k,v in pairs(tbl,defaultComp) do print(k,v) end
  270. function table.sortPairs(tbl, func)
  271. if func == nil then
  272. return rawpairs(tbl)
  273. end
  274. -- 为tbl创建一个对key排序的数组
  275. -- 自己实现插入排序,table.sort遇到nil时会失效
  276. local ary = {}
  277. for key in rawpairs(tbl) do
  278. ary[#ary+1] = key
  279. end
  280. table.sort(ary,func);
  281. -- 定义并返回迭代器
  282. local i = 0
  283. local iter = function ()
  284. i = i + 1
  285. if ary[i] == nil then
  286. return nil
  287. else
  288. return ary[i], tbl[ary[i]]
  289. end
  290. end
  291. return iter
  292. end
  293. --------------------------------
  294. -- 通用比较器(Comparator)
  295. -- @return 对比结果
  296. function table.defaultSort( op1, op2 )
  297. local type1, type2 = type(op1), type(op2)
  298. local num1, num2 = tonumber(op1), tonumber(op2)
  299. if ( num1 ~= nil) and (num2 ~= nil) then
  300. return num1 < num2
  301. elseif type1 ~= type2 then
  302. return type1 < type2
  303. elseif type1 == "string" then
  304. return op1 < op2
  305. elseif type1 == "boolean" then
  306. return op1
  307. -- 以上处理: number, string, boolean
  308. else -- 处理剩下的: function, table, thread, userdata
  309. return tostring(op1) < tostring(op2) -- tostring后比较字符串
  310. end
  311. end