腹水是什么原因引起的| 脑供血不足头晕吃什么药| 88属什么| 胡巴是什么| 吃什么药不能喝酒| 子宫肌壁回声不均匀是什么意思| 马齿苋对什么病最有效| 拯救银河系什么意思| 呼吸困难是什么原因| 左眼跳是什么意思| 夏天喝什么水最好| 梦见老公不理我是什么意思| 下次闰六月是什么时候| 胆汁反流是什么原因引起的| exo是什么意思啊| moncler是什么品牌| 肝钙化斑是什么意思| 梦见牛是什么预兆| 手掌痒是什么原因| 尿素偏高是什么意思| raf是什么意思| 经常腰酸是什么原因女性| 教师节给老师送什么礼物| 脾囊肿是什么病严重吗| 十一月二十五是什么星座| 见什么知什么| 去火吃什么水果| 一什么| 坐月子可以吃什么| 猪冲蛇开什么生肖| 六月初六什么节| 余事勿取 什么意思| 肠易激综合征吃什么药| 什么鹦鹉说话能力最强| 唐玄宗叫什么| 静若幽兰什么意思| 能说会道是什么生肖| 阶级是什么意思| 淋巴用什么药可以消除| 孜字五行属什么| 氨酚咖那敏片是什么药| 大保健什么意思| 女人长胡子是什么原因| 抑制素b检测是什么意思| 尿道口有烧灼感为什么| #NAME?| 跨境电商是做什么的| 返图是什么意思| 女性尿里带血是什么原因| 艾滋病是什么样的| 脚底出汗什么原因| 孜然是什么植物| mg是什么| 去疤痕挂什么科| 疖肿挂什么科| 睾丸为什么会痛| 猫眼石是什么材质| tsh是什么意思| 为什么会得胆囊炎| 过氧化氢是什么意思| 什么都不做| 花青素有什么作用| 打醮是什么意思| 泡酒用什么容器好| 突然胃疼是什么原因| 为什么游戏| 结界是什么意思| 检查肺挂什么科| 鹿五行属什么| 蓟是什么意思| 球菌是什么意思| 结膜炎用什么眼药水效果好| 什么情况下挂疼痛科| 承五行属什么| 晨对什么| 收入是什么意思| 忠诚是什么意思| 马英九是什么生肖| 黄埔军校现在是什么学校| 有什么有什么成语| 肚脐眼下面痛什么原因| 梦见打蛇是什么预兆| 什么是再生纤维素纤维| 婆媳关系为什么难相处| 煲汤放什么药材补气血| 巨蟹座幸运花是什么| 淋巴细胞绝对值偏高是什么原因| 小孩流鼻血挂什么科| 谷氨酰基转移酶低是什么原因| 梦见自己吃面条是什么意思| 天蝎座男是什么性格| 腐竹配什么菜炒好吃| 吃牛油果有什么好处和坏处| 爬山需要准备什么东西| 人发胖的原因是什么引起的| 什么大专好就业| 大饼脸适合什么发型| 什么应什么合| 什么是肺气肿| 幽门螺旋杆菌用什么药| 菠萝蜜的核有什么功效| tct是检查什么的| 紫薇是什么意思| usr是什么意思| 党参有什么作用| 吩可以组什么词| dm是什么| 充盈是什么意思| 尿检弱阳性是什么意思| 醋泡黑豆有什么功效| 醋泡脚有什么好处| 猫藓是什么| 九霄云外是什么生肖| 弱智是什么意思| 糜烂性脚气用什么药| meshor是什么牌子的手表| 须发早白吃什么中成药| 什么是腐女| 史无前例是什么意思| 芋头不能和什么一起吃| 萃的意思是什么| 新疆人是什么民族| hm是什么牌子| 早上头晕是什么原因| 为什么大姨妈迟迟不来| 岳云鹏什么学历| 哪吒为什么叫哪吒| 皮肤发白一块一块的是什么病| 身份证穿什么衣服| 秋葵和什么不能一起吃| 中耳炎挂什么科| 减震器坏了有什么症状| 牙龈炎吃什么药最有效| ai是什么| 尿液突然变深褐色是什么原因| 鹰击长空是什么意思| 周瑜和诸葛亮是什么关系| 二米饭是什么| 大暑什么时候| 轻度脑萎缩是什么意思| 人怕出名猪怕壮是什么生肖| hc是胎儿的什么意思| 海丽汉森是什么档次| 眼睑炎用什么药效果好| 生辰纲是什么东西| 1984年是什么年| 南瓜子吃多了有什么副作用| 刮痧用什么油刮最好| 鞭挞是什么意思| 胸口中间疼是什么原因| 什么样的人容易中风| 水镜先生和司马懿是什么关系| 否极泰来是什么生肖| 红红的苹果像什么句子| 经常耳鸣是什么原因引起的| 好吃懒做的动物是什么生肖| 迎春花是什么颜色的| 系少一撇叫什么| 肌瘤和囊肿有什么区别| 章鱼吃什么食物| cps什么意思| 但愿人长久的下一句是什么| 沉香手串有什么好处| iv是什么意思| 相生相克是什么意思| 落地生根是什么生肖| 凌波仙子指的是什么花| 蒸桑拿是什么意思| 1987年属什么今年多大| 手电筒的金属外壳相当于电路中的什么| 内痔疮吃什么药好得快| 胆汁为什么会反流到胃里面| 麻风病是什么| 尿隐血是什么原因引起的| 拆线去医院挂什么科| 生地麦冬汤有什么功效| 曹操是什么样的人| 什么是管制| 筋膜炎吃什么药| 百合病是什么病| 什么花代表永恒的爱| 感冒是什么意思| 人工授精是什么意思| 打猎是什么意思| mra检查是什么意思| 漂亮的近义词是什么| ipa啤酒什么意思| 品检是做什么的| 去三亚需要什么证件| gmv是什么意思| 甘胆酸偏高是什么原因| 绝经后吃什么能来月经| 鬼火是什么意思| 买碗有什么讲究| 手指伸不直是什么原因| 你在看什么| 固执什么意思| 丁字五行属什么| 白开水喝多了有什么危害| 鸟大了什么林子都有| 女人胸疼是什么原因| 腰椎疼痛吃什么药| 七十岁老人装什么牙合适| 丁字五行属什么| 花椒吃多了对身体有什么影响| 鸡喜欢吃什么食物| 木石是什么字| 为什么会出现幻觉| 平字五行属什么| 九五年属什么生肖| 经常嗳气是什么原因| 异麦芽酮糖醇是什么| 吓得什么填空| 腹泻是什么| 逆商是什么| 鼻毛变白什么征兆| 容易淤青是什么原因| 考拉吃什么食物| 三次元是什么| 脾虚湿蕴证是什么意思| 树叶像什么比喻句| 日加匀念什么| 猫咪为什么害怕黄瓜| 跨界歌手是什么意思| 做完雾化为什么要漱口| 三月二十二是什么星座| 垂体泌乳素高是什么原因| 飞龙在天是什么生肖| 肚脐周围是什么肠| 鸭肉不能和什么一起吃| 藏毛窦挂什么科| 黑豆不能和什么一起吃| 下元节是什么节日| 尿潜血弱阳性是什么意思| 四五天不排便是什么原因| 副作用是什么意思| 小便无力吃什么药| 什么人不能吃人参| 微信备注是什么意思| 精索静脉曲张是什么原因导致的| 羡慕是什么意思| 榴莲有什么功效| col是什么的缩写| o2o什么意思| 肠易激综合征中医叫什么| 1932年属什么生肖| 尿频尿急尿不尽吃什么药效果最好| aojo眼镜什么档次| 外来猫进家有什么预兆| 先明后不争什么意思| 睡醒后腰疼是什么原因| 班门弄斧是什么意思| 钧字五行属什么| 吃黑豆有什么好处| 肾结石都有什么症状| 学前教育学什么| 917是什么意思| 什么发色显白| 早上吃什么好| 郑州有什么好玩的| 斑鸠和鸽子有什么区别| 万箭穿心代表什么生肖| 4朵玫瑰代表什么意思| 喝老陈醋有什么好处| 百度Neidio i'r cynnwys

【美国向中国提出技术许可磋商】中国商务部:将根据WTO争端解决程序处理

Oddi ar Wicipedia
百度 (二)近两年内报考过一级建造师的考生,报名时系统自动确认为老考生。

This module includes a number of functions for dealing with Lua tables. It is a meta-module, meant to be called from other Lua modules, and should not be called directly from #invoke.

Loading the module

[golygu cod]

To use any of the functions, first you must load the module.

local TableTools = require('Module:TableTools')

isPositiveInteger

[golygu cod]
TableTools.isPositiveInteger(value)

Returns true if value is a positive integer, and false if not. Although it doesn't operate on tables, it is included here as it is useful for determining whether a given table key is in the array part or the hash part of a table.

isNan

[golygu cod]
TableTools.isNan(value)

Returns true if value is a NaN value, and false if not. Although it doesn't operate on tables, it is included here as it is useful for determining whether a value can be a valid table key. (Lua will generate an error if a NaN value is used as a table key.)

shallowClone

[golygu cod]
TableTools.shallowClone(t)

Returns a clone of a table. The value returned is a new table, but all subtables and functions are shared. Metamethods are respected, but the returned table will have no metatable of its own. If you want to make a new table with no shared subtables and with metatables transferred, you can use mw.clone instead.

removeDuplicates

[golygu cod]
TableTools.removeDuplicates(t)

Removes duplicate values from an array. This function is only designed to work with standard arrays: keys that are not positive integers are ignored, as are all values after the first nil value. (For arrays containing nil values, you can use compressSparseArray first.) The function tries to preserve the order of the array: the earliest non-unique value is kept, and all subsequent duplicate values are removed. For example, for the table {5, 4, 4, 3, 4, 2, 2, 1} removeDuplicates will return {5, 4, 3, 2, 1}

numKeys

[golygu cod]
TableTools.numKeys(t)

Takes a table t and returns an array containing the numbers of any positive integer keys that have non-nil values, sorted in numerical order. For example, for the table {'foo', nil, 'bar', 'baz', a = 'b'}, numKeys will return {1, 3, 4}.

affixNums

[golygu cod]
TableTools.affixNums(t, prefix, suffix)

Takes a table t and returns an array containing the numbers of keys with the optional prefix prefix and the optional suffix suffix. For example, for the table {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix 'a', affixNums will return {1, 3, 6}. All characters in prefix and suffix are interpreted literally.

numData

[golygu cod]
TableTools.numData(t, compress)

Given a table with keys like "foo1", "bar1", "foo2", and "baz2", returns a table of subtables in the format { [1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'} }. Keys that don't end with an integer are stored in a subtable named "other". The compress option compresses the table so that it can be iterated over with ipairs.

compressSparseArray

[golygu cod]
TableTools.compressSparseArray(t)

Takes an array t with one or more nil values, and removes the nil values while preserving the order, so that the array can be safely traversed with ipairs. Any keys that are not positive integers are removed. For example, for the table {1, nil, foo = 'bar', 3, 2}, compressSparseArray will return {1, 3, 2}.

sparseIpairs

[golygu cod]
TableTools.sparseIpairs(t)

This is an iterator function for traversing a sparse array t. It is similar to ipairs, but will continue to iterate until the highest numerical key, whereas ipairs may stop after the first nil value. Any keys that are not positive integers are ignored.

Usually sparseIpairs is used in a generic for loop.

for i, v in TableTools.sparseIpairs(t) do
   -- code block
end

Note that sparseIpairs uses the pairs function in its implementation. Although some table keys appear to be ignored, all table keys are accessed when it is run.

TableTools.size(t)

Finds the size of a key/value pair table. For example, for the table {foo = 'foo', bar = 'bar'}, size will return 2. The function will also work on arrays, but for arrays it is more efficient to use the # operator. Note that to find the table size, this function uses the pairs function to iterate through all of the table keys.


------------------------------------------------------------------------------------
--                                   TableTools                                   --
--                                                                                --
-- This module includes a number of functions for dealing with Lua tables.        --
-- It is a meta-module, meant to be called from other Lua modules, and should not --
-- be called directly from #invoke.                                               --
------------------------------------------------------------------------------------

local libraryUtil = require('libraryUtil')

local p = {}

-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti

------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
function p.isPositiveInteger(v)
	return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity
end

------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false if
-- not. Although it doesn't operate on tables, it is included here as it is useful
-- for determining whether a value can be a valid table key. Lua will generate an
-- error if a NaN is used as a table key.
------------------------------------------------------------------------------------
function p.isNan(v)
	return type(v) == 'number' and v ~= v
end

------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
function p.shallowClone(t)
	checkType('shallowClone', 1, t, 'table')
	local ret = {}
	for k, v in pairs(t) do
		ret[k] = v
	end
	return ret
end

------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
function p.removeDuplicates(arr)
	checkType('removeDuplicates', 1, arr, 'table')
	local isNan = p.isNan
	local ret, exists = {}, {}
	for _, v in ipairs(arr) do
		if isNan(v) then
			-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
			ret[#ret + 1] = v
		elseif not exists[v] then
			ret[#ret + 1] = v
			exists[v] = true
		end
	end
	return ret
end

------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
function p.numKeys(t)
	checkType('numKeys', 1, t, 'table')
	local isPositiveInteger = p.isPositiveInteger
	local nums = {}
	for k in pairs(t) do
		if isPositiveInteger(k) then
			nums[#nums + 1] = k
		end
	end
	table.sort(nums)
	return nums
end

------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return
-- {1, 3, 6}.
------------------------------------------------------------------------------------
function p.affixNums(t, prefix, suffix)
	checkType('affixNums', 1, t, 'table')
	checkType('affixNums', 2, prefix, 'string', true)
	checkType('affixNums', 3, suffix, 'string', true)

	local function cleanPattern(s)
		-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
		return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
	end

	prefix = prefix or ''
	suffix = suffix or ''
	prefix = cleanPattern(prefix)
	suffix = cleanPattern(suffix)
	local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'

	local nums = {}
	for k in pairs(t) do
		if type(k) == 'string' then
			local num = mw.ustring.match(k, pattern)
			if num then
				nums[#nums + 1] = tonumber(num)
			end
		end
	end
	table.sort(nums)
	return nums
end

------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table
-- of subtables in the format
-- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}.
-- Keys that don't end with an integer are stored in a subtable named "other". The
-- compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
function p.numData(t, compress)
	checkType('numData', 1, t, 'table')
	checkType('numData', 2, compress, 'boolean', true)
	local ret = {}
	for k, v in pairs(t) do
		local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
		if num then
			num = tonumber(num)
			local subtable = ret[num] or {}
			if prefix == '' then
				-- Positional parameters match the blank string; put them at the start of the subtable instead.
				prefix = 1
			end
			subtable[prefix] = v
			ret[num] = subtable
		else
			local subtable = ret.other or {}
			subtable[k] = v
			ret.other = subtable
		end
	end
	if compress then
		local other = ret.other
		ret = p.compressSparseArray(ret)
		ret.other = other
	end
	return ret
end

------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
function p.compressSparseArray(t)
	checkType('compressSparseArray', 1, t, 'table')
	local ret = {}
	local nums = p.numKeys(t)
	for _, num in ipairs(nums) do
		ret[#ret + 1] = t[num]
	end
	return ret
end

------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
function p.sparseIpairs(t)
	checkType('sparseIpairs', 1, t, 'table')
	local nums = p.numKeys(t)
	local i = 0
	local lim = #nums
	return function ()
		i = i + 1
		if i <= lim then
			local key = nums[i]
			return key, t[key]
		else
			return nil, nil
		end
	end
end

------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
function p.size(t)
	checkType('size', 1, t, 'table')
	local i = 0
	for _ in pairs(t) do
		i = i + 1
	end
	return i
end

local function defaultKeySort(item1, item2)
	-- "number" < "string", so numbers will be sorted before strings.
	local type1, type2 = type(item1), type(item2)
	if type1 ~= type2 then
		return type1 < type2
	elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then
		return tostring(item1) < tostring(item2)
	else
		return item1 < item2
	end
end
------------------------------------------------------------------------------------
-- keysToList
--
-- Returns an array of the keys in a table, sorted using either a default
-- comparison function or a custom keySort function.
------------------------------------------------------------------------------------
function p.keysToList(t, keySort, checked)
	if not checked then
		checkType('keysToList', 1, t, 'table')
		checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'})
	end

	local arr = {}
	local index = 1
	for k in pairs(t) do
		arr[index] = k
		index = index + 1
	end

	if keySort ~= false then
		keySort = type(keySort) == 'function' and keySort or defaultKeySort
		table.sort(arr, keySort)
	end

	return arr
end

------------------------------------------------------------------------------------
-- sortedPairs
--
-- Iterates through a table, with the keys sorted using the keysToList function.
-- If there are only numerical keys, sparseIpairs is probably more efficient.
------------------------------------------------------------------------------------
function p.sortedPairs(t, keySort)
	checkType('sortedPairs', 1, t, 'table')
	checkType('sortedPairs', 2, keySort, 'function', true)

	local arr = p.keysToList(t, keySort, true)

	local i = 0
	return function ()
		i = i + 1
		local key = arr[i]
		if key ~= nil then
			return key, t[key]
		else
			return nil, nil
		end
	end
end

------------------------------------------------------------------------------------
-- isArray
--
-- Returns true if the given value is a table and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArray(v)
	if type(v) ~= 'table' then
		return false
	end
	local i = 0
	for _ in pairs(v) do
		i = i + 1
		if v[i] == nil then
			return false
		end
	end
	return true
end

------------------------------------------------------------------------------------
-- isArrayLike
--
-- Returns true if the given value is iterable and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArrayLike(v)
	if not pcall(pairs, v) then
		return false
	end
	local i = 0
	for _ in pairs(v) do
		i = i + 1
		if v[i] == nil then
			return false
		end
	end
	return true
end

------------------------------------------------------------------------------------
-- invert
--
-- Transposes the keys and values in an array. For example, {"a", "b", "c"} ->
-- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to
-- the index of the last duplicate) and NaN values are ignored.
------------------------------------------------------------------------------------
function p.invert(arr)
	checkType("invert", 1, arr, "table")
	local isNan = p.isNan
	local map = {}
	for i, v in ipairs(arr) do
		if not isNan(v) then
			map[v] = i
		end
	end

	return map
end

------------------------------------------------------------------------------------
-- listToSet
--
-- Creates a set from the array part of the table. Indexing the set by any of the
-- values of the array returns true. For example, {"a", "b", "c"} ->
-- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them
-- never equal to any value (including other NaNs or even themselves).
------------------------------------------------------------------------------------
function p.listToSet(arr)
	checkType("listToSet", 1, arr, "table")
	local isNan = p.isNan
	local set = {}
	for _, v in ipairs(arr) do
		if not isNan(v) then
			set[v] = true
		end
	end

	return set
end

------------------------------------------------------------------------------------
-- deepCopy
--
-- Recursive deep copy function. Preserves identities of subtables.
------------------------------------------------------------------------------------
local function _deepCopy(orig, includeMetatable, already_seen)
	if type(orig) ~= "table" then
		return orig
	end
	
	-- already_seen stores copies of tables indexed by the original table.
	local copy = already_seen[orig]
	if copy ~= nil then
		return copy
	end
	
	copy = {}
	already_seen[orig] = copy -- memoize before any recursion, to avoid infinite loops
	
	for orig_key, orig_value in pairs(orig) do
		copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen)
	end
	
	if includeMetatable then
		local mt = getmetatable(orig)
		if mt ~= nil then
			setmetatable(copy, _deepCopy(mt, true, already_seen))
		end
	end
	
	return copy
end

function p.deepCopy(orig, noMetatable, already_seen)
	checkType("deepCopy", 3, already_seen, "table", true)
	return _deepCopy(orig, not noMetatable, already_seen or {})
end

------------------------------------------------------------------------------------
-- sparseConcat
--
-- Concatenates all values in the table that are indexed by a number, in order.
-- sparseConcat{a, nil, c, d}  =>  "acd"
-- sparseConcat{nil, b, c, d}  =>  "bcd"
------------------------------------------------------------------------------------
function p.sparseConcat(t, sep, i, j)
	local arr = {}

	local arr_i = 0
	for _, v in p.sparseIpairs(t) do
		arr_i = arr_i + 1
		arr[arr_i] = v
	end

	return table.concat(arr, sep, i, j)
end

------------------------------------------------------------------------------------
-- length
--
-- Finds the length of an array, or of a quasi-array with keys such as "data1",
-- "data2", etc., using an exponential search algorithm. It is similar to the
-- operator #, but may return a different value when there are gaps in the array
-- portion of the table. Intended to be used on data loaded with mw.loadData. For
-- other tables, use #.
-- Note: #frame.args in frame object always be set to 0, regardless of  the number
-- of unnamed template parameters, so use this function for frame.args.
------------------------------------------------------------------------------------
function p.length(t, prefix)
	-- requiring module inline so that [[Module:Exponential search]] which is
	-- only needed by this one function doesn't get millions of transclusions
	local expSearch = require("Module:Exponential search")
	checkType('length', 1, t, 'table')
	checkType('length', 2, prefix, 'string', true)
	return expSearch(function (i)
		local key
		if prefix then
			key = prefix .. tostring(i)
		else
			key = i
		end
		return t[key] ~= nil
	end) or 0
end

------------------------------------------------------------------------------------
-- inArray
--
-- Returns true if searchElement is a member of the array, and false otherwise.
-- Equivalent to JavaScript array.includes(searchElement) or
-- array.includes(searchElement, fromIndex), except fromIndex is 1 indexed
------------------------------------------------------------------------------------
function p.inArray(array, searchElement, fromIndex)
	checkType("inArray", 1, array, "table")
	-- if searchElement is nil, error?

	fromIndex = tonumber(fromIndex)
	if fromIndex then
		if (fromIndex < 0) then
			fromIndex = #array + fromIndex + 1
		end
		if fromIndex < 1 then fromIndex = 1 end
		for _, v in ipairs({unpack(array, fromIndex)}) do
			if v == searchElement then
				return true
			end
		end
	else
		for _, v in pairs(array) do
			if v == searchElement then
				return true
			end
		end
	end
	return false
end

------------------------------------------------------------------------------------
-- merge
--
-- Given the arrays, returns an array containing the elements of each input array
-- in sequence.
------------------------------------------------------------------------------------
function p.merge(...)
	local arrays = {...}
	local ret = {}
	for i, arr in ipairs(arrays) do
		checkType('merge', i, arr, 'table')
		for _, v in ipairs(arr) do
			ret[#ret + 1] = v
		end
	end
	return ret
end

------------------------------------------------------------------------------------
-- extend
--
-- Extends the first array in place by appending all elements from the second
-- array.
------------------------------------------------------------------------------------
function p.extend(arr1, arr2)
	checkType('extend', 1, arr1, 'table')
	checkType('extend', 2, arr2, 'table')

	for _, v in ipairs(arr2) do
		arr1[#arr1 + 1] = v
	end
end

return p
春季感冒吃什么药 双侧胸膜局限性增厚是什么意思 环形红斑是什么病 阴道出血用什么药 驾校体检都检查什么
亚麻色是什么颜色 命格是什么 菩提有什么寓意 女性外痔擦什么药膏好 什么是夜店
奇亚籽在中国叫什么 尊敬是什么意思 纺织业属于什么行业 糖尿病患者主食应该吃什么 4月15日什么星座
爸爸的外婆叫什么 社康是什么意思 低钾有什么症状和危害 aivei是什么品牌 走马观花是什么生肖
低血压去药店买什么药hcv7jop6ns1r.cn 艾灸痒痒的是什么原因hcv8jop5ns9r.cn 大宝贝是什么意思hcv9jop3ns6r.cn 2007年属猪五行属什么hcv9jop6ns1r.cn 鬼迷心窍是什么生肖hcv8jop1ns4r.cn
2022年是什么生肖年hcv8jop3ns7r.cn gree是什么牌子hcv9jop4ns9r.cn 肚子容易胀气是什么原因hcv8jop0ns6r.cn 什么凌乱hcv7jop6ns7r.cn 复方氨酚苯海拉明片是什么药hcv8jop0ns3r.cn
细菌感染是什么引起的hcv7jop5ns5r.cn 脱脂牛奶是什么意思hcv9jop6ns3r.cn 嘴唇上火起泡用什么药hcv9jop0ns8r.cn 灭蚂蚁什么药最有效hcv9jop1ns9r.cn 成字五行属什么hcv8jop6ns0r.cn
江苏有什么山hcv9jop4ns5r.cn 天天睡不着觉什么原因hcv8jop0ns5r.cn ra是什么意思hcv9jop4ns0r.cn 蝙蝠飞到家里是什么预兆hcv8jop2ns7r.cn 什么品牌的书包质量好hcv9jop0ns3r.cn
百度