Here is my variant of solution of this problem:
extends Node
var arr = ["Tst1", "Tst2", "Tst3", "Test4", "Test5", "t1", "t2", "tt1", "tt2"]
var dict_arr = [{"value": 50}, {"value": 100, "name": "test1"}, {"value": 100, "name": "test2"}, {"value": 20}, {"value": 110, "name": "test3"}, {"value": 110, "name": "test4"}, {"value": 110, "name": "test5"}]
func _ready():
randomize()
print(random_element(arr))
print(random_element_with_biggest_property(dict_arr, "value"))
print(random_element_with_condition(arr, funcref(self, "lengthBigger2")))
print(random_element_with_condition(arr, funcref(self, "lengthBigger3")))
print(random_element_with_condition(arr, funcref(self, "lengthBigger4")))
func random_element(array):
return array[randi() % array.size()]
func random_element_with_biggest_property(array, property : String):
if array.empty():
return null
var accepted = []
var biggestValue = array[0].get(property) if property in array[0] else null
for element in array:
if property in element:
var value = element.get(property)
if value > biggestValue:
accepted.clear()
biggestValue = value
accepted.append(element)
elif value == biggestValue:
accepted.append(element)
if accepted.empty():
return null
else:
return random_element(accepted)
func random_element_with_condition(array, conditionalFunc : FuncRef):
if array.empty():
return null
var accepted = []
for element in array:
if conditionalFunc.is_valid() and conditionalFunc.call_func(element):
accepted.append(element)
if accepted.empty():
return null
else:
return random_element(accepted)
func lengthBigger2(element):
return element.length() > 2
func lengthBigger3(element):
return element.length() > 3
func lengthBigger4(element):
return element.length() > 4
Can you review it? What problems does it have? What is about performance?
Is it possible to find more elegant solution?