2016-07-01 3 views
4

Если вы используете функцию length() на associative array, она вернет «самый большой индекс», используемый в массиве. Итак, если у вас есть ключи, которые не являются целыми числами, length() не вернет действительное количество элементов в вашем массиве. (И это может произойти и по другим причинам.)Как найти длину ассоциативного массива в AutoHotkey?

Есть ли более полезная версия length() для нахождения длины ассоциативного массива?

Или мне нужно фактически прокручивать и подсчитывать каждый элемент? Я не уверен, как бы это сделать, не зная всех возможных ключей заранее.

ответ

3

Если у вас есть плоский массив, то Array.MaxIndex() вернет наибольшее целое число в индексе. Однако это не всегда лучше, потому что AutoHotKey позволит вам иметь массив, первый индекс которого не равен 1, поэтому MaxIndex() может вводить в заблуждение.

Хуже того, если ваш объект является ассоциативной хэш-таблицей, где индекс может содержать строки, то MaxIndex() вернет значение null.

Так что, наверное, лучше всего их посчитать.

DesiredDroids := object() 
DesiredDroids["C3P0"] := "Gold" 
DesiredDroids["R2D2"] := "Blue&White" 
count :=0 
for key, value in DesiredDroids 
    count++ 
MsgBox, % "We're looking for " . count . " droid" . (count=1 ? "" : "s") . "." 

Выход

We're looking for 2 droids. 
+0

Более короткий способ получения графа на объекте, вам сэкономить два/три строки кода: 'DesiredDroids.SetCapacity (0)' – errorseven

+0

Это будет работать, но объект. SetCapacity (0) также усекает неиспользуемое пространство. Если ваш объект растет и сильно сокращается в течение короткого периода времени, вы можете столкнуться с проблемой производительности или, что еще хуже, фрагментацией памяти (ссылка [сообщение Lexikos о том, что на полпути вниз] (https://autohotkey.com/board/topic/81609 -ahk-л-Preferred-один вкладыш к пустому-объект-перед тем, повторное использование /)) –

Смежные вопросы