2025-08-28 09:36:01 +08:00
|
|
|
class_name ArrayTool
|
|
|
|
|
|
|
|
|
|
static func removeAll(array: Array, value) -> Array:
|
2025-11-15 07:33:06 +08:00
|
|
|
var result = []
|
|
|
|
|
for item in array:
|
|
|
|
|
if item != value:
|
|
|
|
|
result.append(item)
|
|
|
|
|
return result
|
2025-09-21 21:58:57 +08:00
|
|
|
static func swap(array: Array, a: int, b: int):
|
2025-11-15 07:33:06 +08:00
|
|
|
var temp = array[a]
|
|
|
|
|
array[a] = array[b]
|
|
|
|
|
array[b] = temp
|
|
|
|
|
return array
|
|
|
|
|
static func parseEncodedObject(arr: Array) -> Array:
|
|
|
|
|
var result = []
|
|
|
|
|
for item in arr:
|
|
|
|
|
if item is EncodedObjectAsID:
|
|
|
|
|
result.append(instance_from_id(item.get_instance_id()))
|
|
|
|
|
else:
|
|
|
|
|
result.append(item)
|
|
|
|
|
return result
|
2026-05-03 16:03:02 +08:00
|
|
|
static func betterMap(arr: Array, executor: Callable) -> Array:
|
|
|
|
|
var result = []
|
|
|
|
|
for index in len(arr):
|
|
|
|
|
result.append(executor.call(arr[index], index, arr))
|
|
|
|
|
return result
|
2026-05-04 10:52:17 +08:00
|
|
|
static func fill(origin: Dictionary, filler: Callable) -> Dictionary:
|
|
|
|
|
return origin.keys().reduce(
|
|
|
|
|
func(accum, key):
|
|
|
|
|
accum[key] = filler.call(key)
|
|
|
|
|
return accum,
|
|
|
|
|
{}
|
|
|
|
|
)
|
2026-05-09 21:41:00 +08:00
|
|
|
static func mapEntries(origin: Dictionary, mapper: Callable) -> Dictionary:
|
|
|
|
|
return origin.keys().reduce(
|
|
|
|
|
func(accum, key):
|
|
|
|
|
var entry = mapper.call(key, origin[key])
|
|
|
|
|
accum[entry[0]] = entry[1]
|
|
|
|
|
return accum,
|
|
|
|
|
{}
|
|
|
|
|
)
|
2026-05-04 21:34:57 +08:00
|
|
|
static func dictionaryFromEntries(keys: Array, values: Array) -> Dictionary:
|
|
|
|
|
var result = {}
|
|
|
|
|
for index in len(keys):
|
|
|
|
|
var key = keys[index]
|
|
|
|
|
var value = values[index]
|
|
|
|
|
result[key] = value
|
|
|
|
|
return result
|
|
|
|
|
static func mergeDictionary(a: Dictionary, b: Dictionary) -> Dictionary:
|
|
|
|
|
var result := {}
|
|
|
|
|
for key in a:
|
|
|
|
|
result[key] = a[key]
|
|
|
|
|
for key in b:
|
|
|
|
|
result[key] = result.get(key, 0.0) + b[key]
|
|
|
|
|
return result
|
2026-05-10 06:43:08 +08:00
|
|
|
static func getNested(data: Variant, path: String) -> Variant:
|
|
|
|
|
var keys = path.split(".")
|
|
|
|
|
var result = data
|
|
|
|
|
for key in keys:
|
|
|
|
|
if result is Dictionary:
|
|
|
|
|
result = result[key]
|
|
|
|
|
elif result is Array:
|
|
|
|
|
result = result[key.to_int()]
|
|
|
|
|
else:
|
|
|
|
|
return null
|
|
|
|
|
return result
|
|
|
|
|
static func setNested(data: Variant, path: String, value: Variant):
|
|
|
|
|
var keys = path.split(".")
|
|
|
|
|
for i in range(keys.size() - 1):
|
|
|
|
|
var key = keys[i]
|
|
|
|
|
if data is Dictionary:
|
|
|
|
|
data = data[key]
|
|
|
|
|
elif data is Array:
|
|
|
|
|
data = data[key.to_int()]
|
|
|
|
|
else:
|
|
|
|
|
return
|
|
|
|
|
var lastKey = keys[-1]
|
|
|
|
|
if data is Dictionary:
|
|
|
|
|
data[lastKey] = value
|
|
|
|
|
elif data is Array:
|
|
|
|
|
var index = lastKey.to_int()
|
|
|
|
|
if index == data.size():
|
|
|
|
|
data.append(value)
|
|
|
|
|
else:
|
|
|
|
|
data[index] = value
|
|
|
|
|
return data
|