<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Классы Map и Set (полу аналог JavaScript)]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=16908&amp;type=atom" />
	<updated>2022-01-26T03:19:51Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=16908</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Классы Map и Set (полу аналог JavaScript)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=151809#p151809" />
			<content type="html"><![CDATA[<p>Ну Map для меня всегда имел мало смысла, даже в JS, хотя он меня спасал, когда нужно было хранить оооочень много данных (больше 14.000.000), тогда он себя шикарно проявил.<br />А так, я делал в основном Set ибо польза на лицо.</p>]]></content>
			<author>
				<name><![CDATA[Phoenixxx_Czar]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=34426</uri>
			</author>
			<updated>2022-01-26T03:19:51Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=151809#p151809</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Классы Map и Set (полу аналог JavaScript)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=151807#p151807" />
			<content type="html"><![CDATA[<p><em>HasKey()</em> тоже довольно быстро работает.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2022-01-26T01:46:19Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=151807#p151807</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Классы Map и Set (полу аналог JavaScript)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=151806#p151806" />
			<content type="html"><![CDATA[<p>Вообще преимущество Map и Set в JS еще в скорости, там происходит поиск во много раз быстрее, но увы, мы имеем AHK, думаю в v2 и будет работать нормально.</p>]]></content>
			<author>
				<name><![CDATA[Phoenixxx_Czar]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=34426</uri>
			</author>
			<updated>2022-01-25T23:56:42Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=151806#p151806</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Классы Map и Set (полу аналог JavaScript)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=151798#p151798" />
			<content type="html"><![CDATA[<p>Возможно, в некоторых случаях подобные «удобняшки» будут полезны, но чаще всего можно обойтись простым трюком, используя ключ вместо значения:<br /></p><div class="codebox"><pre><code>obj := {}
obj[1] := 1
obj[1] := 2
obj[1] := 3

MsgBox, % obj.HasKey(1)
MsgBox, % obj.Count()</code></pre></div>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2022-01-25T14:04:10Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=151798#p151798</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Классы Map и Set (полу аналог JavaScript)]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=151797#p151797" />
			<content type="html"><![CDATA[<p>Не хватало данного функционала и решил попробовать реализовать.</p><p>Зачем нужен Set? По сути это массив, в котором значения не могут повторяться, с помощью метода <em>.has(value)</em> можно узнать, есть ли данное значение в &quot;списке&quot;.<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Примеры использования Set</div><div class="fancy_spoiler"><div class="codebox"><pre><code>
mySet := new Set()

mySet.add(1)
mySet.add(1)
mySet.add(1)
mySet.add(1)

mySet.values() ; [1]
mySet.size ; 1

mySet.add(5)

mySet.values() ; [1, 5]
mySet.size ; 2

mySet.has(5) ; true
mySet.has(3) ; false

mySet.delete(5)

mySet.values() ; [1]
mySet.size ; 1

mySet.add(53)
mySet.add(54)

mySet.values() ; [1, 53, 54]
mySet.size ; 3

mySet.clear()

mySet.values() ; []
mySet.size ; 0
</code></pre></div><div class="codebox"><pre><code>mySet := new Set([1, 1, 3, 4, 5, 5, 123])
mySet.values() ; [1, 3, 4, 5, 123]</code></pre></div><p>Так же можно добавлять в цепочке:<br /></p><div class="codebox"><pre><code>mySet := new Set()
mySet.add(1).add(1).add(3).add(4).add(5).add(5).add(123)
mySet.values() ; [1, 3, 4, 5, 123]</code></pre></div></div></div><br /><p>Зачем нужен Map? Ну.. По сути этот же объект, но с методом <em>.has(key)</em>, который проверяет, находится ли key (ключ) в объекте. Ну и возможностью получить только ключ, только значения ну или массив с массивами [ключ, значение].<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Примеры использования Map</div><div class="fancy_spoiler"><div class="codebox"><pre><code>myMap := new Map()

myMap.set(&quot;Ключ 1&quot;, &quot;Значение 1&quot;)

myMap.size ; 1
myMap.get(&quot;Ключ 1&quot;) ; Значение 1
myMap.has(&quot;Ключ 1&quot;) ; true
myMap.entries() ; [[&quot;Ключ 1&quot;, &quot;Значение 1&quot;]]
myMap.values() ; [&quot;Значение 1&quot;]
myMap.keys() ; [&quot;Ключ 1&quot;]

myMap.delete(&quot;Ключ 1&quot;)
myMap.has(&quot;Ключ 1&quot;) ; false
myMap.entries() ; {}
myMap.values() ; []
myMap.keys() ; []

myMap.set(&quot;Ключ 1&quot;, &quot;Значение 1&quot;)
myMap.set(&quot;Ключ 2&quot;, &quot;Значение 2&quot;)
myMap.set(&quot;Ключ 3&quot;, &quot;Значение 3&quot;)

; или:
; myMap.set(&quot;Ключ 1&quot;, &quot;Значение 1&quot;).set(&quot;Ключ 2&quot;, &quot;Значение 2&quot;).set(&quot;Ключ 3&quot;, &quot;Значение 3&quot;)

myMap.size ; 3
myMap.entries() ; [[&quot;Ключ 1&quot;, &quot;Значение 1&quot;], [&quot;Ключ 2&quot;, &quot;Значение 2&quot;], [&quot;Ключ 3&quot;, &quot;Значение 3&quot;]]
myMap.values() ; [&quot;Значение 1&quot;, &quot;Значение 2&quot;, &quot;Значение 3&quot;]
myMap.keys() ; [&quot;Ключ 1&quot;, &quot;Ключ 2&quot;, &quot;Ключ 3&quot;]

myMap.clear()

myMap.entries() ; {}
myMap.values() ; []
myMap.keys() ; []
</code></pre></div><div class="codebox"><pre><code>
myMap := new Map([[&quot;Ключ 1&quot;, &quot;Значение 1&quot;]
				, [&quot;Ключ 2&quot;, &quot;Значение 2&quot;]
				, [&quot;Ключ 3&quot;, &quot;Значение 3&quot;]])

myMap.size ; 3
myMap.has(&quot;Ключ 1&quot;) ; true
myMap.entries() ; [[&quot;Ключ 1&quot;, &quot;Значение 1&quot;], [&quot;Ключ 2&quot;, &quot;Значение 2&quot;], [&quot;Ключ 3&quot;, &quot;Значение 3&quot;]]
myMap.values() ; [&quot;Значение 1&quot;, &quot;Значение 2&quot;, &quot;Значение 3&quot;]
myMap.keys() ; [&quot;Ключ 1&quot;, &quot;Ключ 2&quot;, &quot;Ключ 3&quot;]</code></pre></div></div></div><br /><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Классы</div><div class="fancy_spoiler"><div class="codebox"><pre><code>
/**
 * Методы:
 * - add(value)		Добавляет &#039;value&#039; к Set объекту. Возвращает Set объект
 * - clear()		Удаляет все элементы из Set объекта
 * - delete(value)	Удаляет &#039;value&#039; из Set объекта. Возвращает успешность удаления (true/false)
 * - has(value)		Проверяет, находится ли значение в Set объекте. Возвращает (true/false)
 * - values()		Возвращает все значение из Set объекта
 * Свойства:
 * - size			Возвращает количество значений в Set объекте
 */

class Set
{
	__new(arr := &quot;&quot;)
	{
		this.data := []

		for index, value in arr
		{
			this.add(value)
		}
	}

	add(value)
	{
		if (!this.has(value))
		{
			this.data.push(value)
		}

		return this
	}

	clear()
	{
		this.data := []
	}

	delete(value)
	{
		if (index := this._indeOf(value))
		{
			this.data.delete(index)
		}

		return index ? true : false
	}

	has(value)
	{
		return this._indeOf(value) ? true : false
	}

	values()
	{
		return this.data.clone()
	}

	_indeOf(value)
	{
		for index, element in this.data
		{
			if (value == element)
			{
				return index
			}
		}

		return 0
	}

	size[]
	{
		get
		{
			return this.data.count()
		}

		set
		{
			return
		}
	}
}

</code></pre></div><div class="codebox"><pre><code>/**
 * Методы:
 * - set(key, value)	Добавляет пару ключ-значение. Возвращает Map объект
 * - clear()			Удаляет все пары ключ-значеие из Map объекта
 * - delete(key)		Удаляет &#039;ключ&#039; из Map объекта. Возвращает успешность удаления (true/false)
 * - has(key)			Проверяет, находится ли ключ в Map объекте. Возвращает (true/false)
 * - values()			Возвращает все значение из Map объекта
 * - keys()				Возвращает все ключи из Map объекта
 * - entries()			Возвращает массив с массивами из [key, value]
 * Свойства:
 * - size				Возвращает количество пар ключ-значение в Map объекте
 */

class Map
{
	__New(iterable := &quot;&quot;)
	{
		this.data := {}

		for index, data in iterable
		{
			this.data[data[1]] := data[2]
		}
	}

	get(key)
	{
		return this.data[key]
	}

	set(key, value)
	{
		this.data[key] := value

		return this
	}

	has(key)
	{
		return this.data[key] ? true : false
	}

	delete(key)
	{
		if (isHas := this.has(key))
		{
			this.data.delete(key)
		}

		return isHas
	}

	clear()
	{
		this.data := {}
	}

	values()
	{
		arr := []

		for key, value in this.data
		{
			arr.push(value)
		}

		return arr
	}

	keys()
	{
		arr := []

		for key in this.data
		{
			arr.push(key)
		}

		return arr
	}

	entries()
	{
		arr := []

		for key, value in this.data
		{
			arr.push([key, value])
		}

		return arr
	}

	size[]
	{
		get
		{
			return this.data.count()
		}

		set
		{
			return
		}
	}
}

</code></pre></div></div></div>]]></content>
			<author>
				<name><![CDATA[Phoenixxx_Czar]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=34426</uri>
			</author>
			<updated>2022-01-25T10:48:33Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=151797#p151797</id>
		</entry>
</feed>
