1 (изменено: Phoenixxx_Czar, 2021-04-05 19:45:27)

Тема: AHK: array flat

Пытаюсь сделать из массива:

[1, 2, [1, 3]]

Массив:

[1, 2, 1, 3]

Но что-то я подтупливаю:

arrayFlat(arr)
{
	newArr := []

	for i, v in arr
	{
		newArr.Push(IsObject(v) ? arrayFlat(v) : v)
	}

	return newArr
}

UPD: Получилось что-то такое, как можно улучшить?

arrayFlat(arr, result := "")
{
	if (!result)
	{
		result := []
	}

	for k, v in arr
	{
		if (isObject(v))
		{
			arrayFlat(v, result)
		}
		else
		{
			result.Push(v)
		}
	}

	return result
}
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

2 (изменено: teadrinker, 2021-04-05 23:30:33)

Re: AHK: array flat

Если нужно раскрывать независимо от уровня вложенности, то так:

arr := [1, 2, [3, 4, [5, 6, [7, 8]]]]
arrayFlat(arr)
for k, v in arr
   str .= (str ? ", " : "") . v
MsgBox, % str

arrayFlat(arr) {
   Loop % len := arr.Count() {
      i := len - A_Index + 1
      if IsObject(item := arr[i]) {
         arr.RemoveAt(i)
         arr.InsertAt(i, arrayFlat(item)*)
      }
   }
   Return arr
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: teadrinker, 2021-04-06 23:21:04)

Re: AHK: array flat

Вот так с указанием уровня вложенности:

FlatArray(arr, depth := 0xFFFFFFFF) {
   if (depth = 0)
      Return arr
   Loop % len := arr.Count() {
      i := len - A_Index + 1
      if IsObject(arr[i])
         arr.InsertAt(i, FlatArray(arr.RemoveAt(i), depth - 1)*)
   }
   Return arr
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder