1 (изменено: Phoenixxx_Czar, 2022-07-08 00:33:53)

Тема: AHK: Объединить объекты

Я пытался реализовать Object.assing из JS, раньше не особо заморачивался, но сейчас хочу решить одну проблему, я не получаю нужный результат:

class Object
{
	assign(target, sources*)
	{
		target := Object.clone(target)

		for i, arr in sources
		{
			for key, value in arr
			{
				target[key] := (IsObject(value) && !value.base.IsArray) ? Object.clone(value, target[key]) : value
			}
		}

		return target
	}

	clone(obj)
	{
		cloned := obj.clone()

		for i, key in obj
		{
			if IsObject(key)
			{
				cloned[i] := Object.clone(key)
			}
		}

		return cloned
	}
}

obj1 := {a: {a: 1}}
obj2 := {a: {b: 2}}
obj3 := {b: 1}

test := Object.assign(obj1, obj2, obj3) ; {"a": {"b": 2}, "b": 1}
; Ожидаемым результатом было: {"a": {"a": 1, "b": 2}, "b": 1}

Хотя.. Данный код обрабатывается точно так же и в JS, получается мне нужно что-то типо deepAssign.

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

2 (изменено: Phoenixxx_Czar, 2022-07-08 01:10:50)

Re: AHK: Объединить объекты

Пришлось переписать JS код взятый из поста.

class Object
{
	assign(target, sources*)
	{
		target := Object.clone(target)

		for i, arr in sources
		{
			for key, value in arr
			{
				target[key] := (IsObject(value) && !value.base.IsArray) ? Object.clone(value, target[key]) : value
			}
		}

		return target
	}

	assignDeep(target, sources*)
	{
		if (!sources.count())
		{
			return target
		}

		source := sources[1]
		sources.removeAt(1)

		if (isObject(target) && isObject(source))
		{
			for key in source
			{
				if (isObject(source[key]))
				{
					if (!target[key])
					{
						target[key] := {}
					}

					Object.assignDeep(target[key], source[key])
				}
				else
				{
					target[key] := source[key]
				}
			}
		}

		return Object.assignDeep(target, sources*)
	}

	clone(obj)
	{
		cloned := obj.clone()

		for i, key in obj
		{
			if IsObject(key)
			{
				cloned[i] := Object.clone(key)
			}
		}

		return cloned
	}
}

Мне пришлось использовать такую конструкцию:

source := sources[1]
sources.removeAt(1)

... дабы получить и удалить первый элемент массива, почему не срабатывает .shift()? Метод уходит в бесконечную рекурсию ибо .shift() ничего не возвращает.

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

3

Re: AHK: Объединить объекты

Я сейчас даже не понял, в чём вопрос. О каком shift() идёт речь, и где он не срабатывает?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4 (изменено: Phoenixxx_Czar, 2022-07-08 02:39:47)

Re: AHK: Объединить объекты

Phoenixxx_Czar пишет:

source := sources[1]
sources.removeAt(1)

Вместо этого кода в решении на JS используется ".shift()", насколько я помню он работает так же, как я написал это другим кодом и насколько я знаю, этот (shift) метод есть у массивов в AHK. Но он почему-то не срабатывает в AHK.
Вопрос уже решен добавлением метода "assignDeep".

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

5

Re: AHK: Объединить объекты

Phoenixxx_Czar пишет:

этот (shift) метод есть у массивов в AHK

Где вы его обнаружили? Я о таком ничего не знаю.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Объединить объекты

Хм.. Возможно я перепутал, сейчас смотрел код класса для работы с массивами и нашел там метод "shift" который реализовали как:

shift(arr)
{
	return arr.RemoveAt(1)
}

Значит и мой код можно сократить до:

source := sources.removeAt(1)
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)