模块:SortUtil

来自维阿百科
1.38>牛腩面2022年7月6日 (三) 11:25的版本 (创建页面,内容为“local util_args = require('Module:ArgsUtil') local util_table = require('Module:TableUtil') local lang = mw.getLanguage('en') local h = {} function h.compareTwoArraysByKeys(a, b, keyTbl, incTbl, i) if i > #keyTbl then retu…)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

此模块的文档可以在模块:SortUtil/doc创建

local util_args = require('Module:ArgsUtil')
local util_table = require('Module:TableUtil')

local lang = mw.getLanguage('en')

local h = {}
function h.compareTwoArraysByKeys(a, b, keyTbl, incTbl, i)
	if i > #keyTbl then return nil end
	local thisKey = keyTbl[i]
	if a[thisKey] == b[thisKey] or not a[thisKey] or not b[thisKey] then
		return h.compareTwoArraysByKeys(a, b, keyTbl, incTbl, i+1)
	end
	return h.compareNumberOrString(a[thisKey], b[thisKey], incTbl[i])
end

function h.compareNumberOrString(a, b, increasing)
	if increasing then return h.compareNumberOrString(b, a, false) end
	if tonumber(a) and tonumber(b) then
		return tonumber(a) > tonumber(b)
	end
	return lang:caseFold(a) > lang:caseFold(b)
end

local p = {}

function p.tablesByKeys(tbl, key, increasing)
	local keyTbl = util_table.guaranteeTable(key)
	local incTbl = util_table.guaranteeTable(increasing) or {}
	table.sort(tbl,
		function(a,b)
			return h.compareTwoArraysByKeys(a, b, keyTbl, incTbl, 1)
		end)
end

function p.dictByKeys(tbl, key, increasing)
	local keyTbl = util_table.guaranteeTable(key)
	local incTbl = util_table.guaranteeTable(increasing) or {}
	table.sort(tbl,
		function(a,b)
			local result = h.compareTwoArraysByKeys(tbl[a], tbl[b], keyTbl, incTbl, 1)
			if result == nil then
				return a < b
			end
			return result
		end)
end

function p.sortConstantDictionary(tbl)
	table.sort(tbl,
		function(a,b)
			return h.compareNumberOrString(tbl[a], tbl[b])
		end)
end

return p