<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=5037</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=5037&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «JScript: Расширение объекта Enumerator, упрощение работы с коллекциями».]]></description>
		<lastBuildDate>Mon, 25 Oct 2010 17:48:42 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40830#p40830</link>
			<description><![CDATA[<p>Я не издеваюсь. Вы привели полноценный рабочий пример, спасибо!<br />Просто я сообщил, по какой причине у меня оно оказывается не работало. Мне было забавно, что так и не сообразил. Собственно этому и был посвящен смайлик.<br />Указанную статью прочел, интересный ECMA-цикл, видимо стоит прочесть весь.</p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Mon, 25 Oct 2010 17:48:42 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40830#p40830</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40811#p40811</link>
			<description><![CDATA[<p>Вы издеваетесь? Я привел полноценный рабочий пример! Это полноценная функция, которая суть метод объекта Enumerator, и которая по определению функция-выражение. </p><p>Если Вы заинтересованы в javascript почитайте эту статью <a href="http://dmitrysoshnikov.com/ecmascript/ru-chapter-5-functions/">http://dmitrysoshnikov.com/ecmascript/r … functions/</a></p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Mon, 25 Oct 2010 05:49:04 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40811#p40811</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40806#p40806</link>
			<description><![CDATA[<p>Не работает, если определение Enumerator находится ниже его использования. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> <br />Ну да, это ведь не полноценная функция и не класс, чтобы быть описанным позже.</p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Sun, 24 Oct 2010 23:19:19 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40806#p40806</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40780#p40780</link>
			<description><![CDATA[<div class="codebox"><pre><code>Enumerator.forItems = function(collection, fun, thisp)
{
    if ( typeof fun != &quot;function&quot; ) {
        throw new TypeError();
    }

    var fc = new Enumerator(collection);
    for ( ; ! fc.atEnd(); fc.moveNext()) {
        var i = fc.item();
        fun.call(thisp, i, collection);
    }
};

var fso = new ActiveXObject(&#039;Scripting.FileSystemObject&#039;);
var drives = fso.Drives;

Enumerator.forItems(drives, function(drive)
{
    WScript.Echo(drive);
});</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sun, 24 Oct 2010 04:12:25 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40780#p40780</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40779#p40779</link>
			<description><![CDATA[<p>Так и не смог я в тот вечер понять...<br />Приведите пожалуйста один полностью рабочий фрагмент применения .forItems, включая ее определение, например имена дисков показать через WScript.Echo()<br />Пытался в течение часа применить очевидную конструкцию. Очевидным оказалось лишь то, что чего-то не понял. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Sat, 23 Oct 2010 20:21:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40779#p40779</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40683#p40683</link>
			<description><![CDATA[<p>Конечно, отдельная библиотека, дополнительные слова, все это в сумме не будет лаконичнее станартного решения. И Вы правы, что &quot;следующий до конца&quot; понятен каждому. Однако JavaScript имеет свой собственный путь, &quot;путь JavaScript&quot;. В языке есть такие непривычные на первый взгляд понятия как <strong>пространство имен</strong>, <strong>замыкание</strong>, <strong>прототипное наследование</strong>, <strong>контекст исполнения/вызова</strong>. </p><p>Многие js-библиотеки реализуют различные расширения стандартных свойств объектов, добавляют свои. Например, стандартный перебор элементов массива:<br /></p><div class="codebox"><pre><code>for (var i = 0; i &lt; arr.length; i++) {
    alert(arr[i]);
}</code></pre></div><p>Эти библиотеки часто делают так:<br /></p><div class="codebox"><pre><code>// расширяя методы стандарных объектов (Firefox реализует или уже реализовал этот метод, МСИЕ - собирается в 8 или 9 версии)
arr.forEach(function(v)
{
    alert(v);
});

// или как в популярной jQuery применяя методы к объектам
$.each(arr, function(v)
{
    alert(v);
});</code></pre></div><p>.<br />Я понимаю, что многим такое кажется странным, но, повторюсь, это путь JavaScript. К нему привыкаешь и начинаешь мыслить также : ) Абсолютно естественно, что данное решение было сделано именно в таком же ключе. Читая, или перенося некий vbscript-код:<br /></p><div class="codebox"><pre><code>For Each objVar In objColl
...
Next</code></pre></div><p>Я думаю, о том как это будет выглядеть в JScript и ужасался:<br /></p><div class="codebox"><pre><code>for (var fc = new Enumerator(objColl); ! fc.atEnd(); fc.moveNext()) {
    var objVar = fc.item();
...
}</code></pre></div><p>Это код вызывает грусть. Он некрасивый. Опять посмотрите на VBScript. Вот почему я сокрушался раньше что не смогли разработчики сделать аналогичную конструкцию в JScript. Поэтому мне, привыкшему много писать и разбираться в JavaScript, следующий код ближе, яснее и понятнее предыдущего. <br /></p><div class="codebox"><pre><code>Enumerator.forItems(objColl, function(objVar)
{
....
});</code></pre></div><p>P.S.: <br /><em>Название повеселило -&nbsp; особенно последнее слово... </em> <br />А меня-то как оно веселило, пока пытался втиснуть хоть какое-то более менее осмысленное название в поле имени темы. И одна буква все-таки не влезла.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Thu, 21 Oct 2010 14:10:09 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40683#p40683</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40680#p40680</link>
			<description><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>...<br />Но <strong>Enumerator</strong> проигрывает в лаконичности <strong>For Each</strong>: много лишних переменных, громоздкая конструкция: <br />.<br />Сокращенный пример JScript из документации<br /></p><div class="codebox"><pre><code>var fso = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);

for (var e = new Enumerator(fso.Drives); ! e.atEnd(); e.moveNext()) {
    var drive = e.item();
    ...
}</code></pre></div><p>.<br />Вариант примера на VBScript<br /></p><div class="codebox"><pre><code>Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)

For Each drive In fso.Drives
    ...
Next</code></pre></div></blockquote></div><p>Rumata,</p><p>интересное решение.<br />Особенно для меня - с JScript я работаю недавно и его языковые и функциональные возможности я пока не могу ни оценить в полной мере, ни в полной мере использовать.</p><p>Позвольте выскажу свое мнение именно как потенциальный пользователь (притом начинающий в JScript).<br />Ваше утверждение насчет &quot;проигрывает в лаконичности&quot;, на мой взгляд спорно - хотя бы по количеству символов стандартного подхода и Вашего решения.<br />Но вот - опять же исключительно по моему мнению - в &quot;прозрачности&quot;, &quot;понятности&quot; стандартный вызов явно впереди.<br />Просто в силу того, что цикл &quot;следующий до тех пор пока не конец&quot; существует в любом языке.</p><p>Если уж говорить о развитии работы с коллекциями, то и в VBS и в JScript есть действительно принципиальное ограничение - движение только в одном направлении (moveNext).<br />Хотя принципиальных проблем движения movePrevious я не вижу. А вот ведь нет его.</p><p>PS Название повеселило -&nbsp; особенно последнее слово... <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Slav)]]></author>
			<pubDate>Thu, 21 Oct 2010 13:19:30 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40680#p40680</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40498#p40498</link>
			<description><![CDATA[<p>Спсибо за замечание. Исправил текст в первом сообщении и код по ссылке, А вот название темы - виноват, забыл. Испраляю повторно. Привожу характер исправлений:</p><p>1. объект Enumerate удален <br />2. методы объекта Enumerate перенесены в объект Enumerator<br />3. исправлен исходный текст в первом сообщении и по ссылке <br />4. исправлены текст первого сообщения и название темы для соответствия текущим изменениям</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sat, 16 Oct 2010 14:50:32 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40498#p40498</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40497#p40497</link>
			<description><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>Исправил.</p></blockquote></div><p>А смысл? В Коллекции — там понятно зачем. А здесь… Нет ссылки — не понятно, где именно исправили — раз! Теряется смысл обсуждения последующих постов за исправленным — два! Лучше бы добавили в конец, а туда добавили ссылку на новый пост.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sat, 16 Oct 2010 14:36:55 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40497#p40497</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40494#p40494</link>
			<description><![CDATA[<p>В данном случае прототип - не самое лучшее место - теряется доступ к самой коллекции. А вот сам объект Enumerator... Исправил. Теперь зарекомендованная функциональность из под Enumerate &quot;ушла под крыло&quot; объекта Enumerator.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sat, 16 Oct 2010 13:37:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40494#p40494</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40492#p40492</link>
			<description><![CDATA[<p>Да это так. Но Enumerator - неродной для JavaScript. Поэтому я и не подозревал о возможности модифицировать конструктор и прототип. </p><p>Често говоря... Enumerator - кривое порождение программистов Редмонда, &quot;костыль&quot;. Было странно, что они не вложили аналогичный функционал в конструкцию for in (врядли подобное будет реализовано в констуркции for each in).</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sat, 16 Oct 2010 13:15:32 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40492#p40492</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40480#p40480</link>
			<description><![CDATA[<p>Все встроенные объекты имеют прототип.</p>]]></description>
			<author><![CDATA[null@example.com (JSmаn)]]></author>
			<pubDate>Sat, 16 Oct 2010 06:44:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40480#p40480</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40445#p40445</link>
			<description><![CDATA[<div class="quotebox"><cite>smaharbA пишет:</cite><blockquote><p>а чем прототип не угодил ?</p></blockquote></div><p>Однако!!! Не предполагал, точнее даже знал, что Enumerator имеет прототип.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Thu, 14 Oct 2010 22:15:27 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40445#p40445</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40443#p40443</link>
			<description><![CDATA[<p>а чем прототип не угодил ?<br /></p><div class="codebox"><pre><code>var fso = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);
Enumerator.prototype.toArray=function(){x=new Array(i=0);for (;!this.atEnd();this.moveNext()) x[i++]=this.item(); return x};

WScript.Echo(new Enumerator(fso.Drives).toArray());</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (smaharbA)]]></author>
			<pubDate>Thu, 14 Oct 2010 20:33:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40443#p40443</guid>
		</item>
		<item>
			<title><![CDATA[JScript: Расширение объекта Enumerator, упрощение работы с коллекциями]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=40419#p40419</link>
			<description><![CDATA[<p><em>Предлагаю тему для обсуждения. Однажды класс уже вскользь упоминался на форуме - <a href="http://forum.script-coding.com/viewtopic.php?pid=34966#p34966">#11</a>. Предлагаемое обсуждение немного перекликается с темой <a href="http://forum.script-coding.com/viewtopic.php?id=4315">WSH: Сравнение VBScript и JScript</a></em></p><p>JScript, в отличие от VBScript, не имеет простых языковых средств перебора элементов коллекций. Чтобы решить эту проблему <em>изобретатели</em> из Рэдмонда ввели <a href="http://msdn.microsoft.com/en-us/library/6ch9zb09%28VS.85%29.aspx">объект Enumerator</a><br /></p><div class="quotebox"><blockquote><p>The Enumerator object provides a way to access any member of a collection and behaves similarly to the For...Each statement in VBScript.</p></blockquote></div><p>Но <strong>Enumerator</strong> проигрывает в лаконичности <strong>For Each</strong>: много лишних переменных, громоздкая конструкция: <br />.<br />Сокращенный пример JScript из документации<br /></p><div class="codebox"><pre><code>var fso = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);

for (var e = new Enumerator(fso.Drives); ! e.atEnd(); e.moveNext()) {
    var drive = e.item();
    ...
}</code></pre></div><p>.<br />Вариант примера на VBScript<br /></p><div class="codebox"><pre><code>Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)

For Each drive In fso.Drives
    ...
Next</code></pre></div><p>.<br />Вместо этого предлагаю чуть более лаконичную конструкцию - по сути, <em>&quot;синтаксический сахар&quot;, полностью реализованный в духе JavaScript</em>. Встроенный объект <strong>Enumerator</strong> расширен тремя однотипными статическими методами для обхода коллекций, которые, в зависимости от своей функции, генерируют массив, хэш (объект) или просто перебирают элементы коллекции. Методы по-прежнему используют встроенный объект <strong>Enumerator</strong>, но реализация полностью сокрыта внутри методов, текущий контекст свободен от избыточных переменных, сохранена лаконичность кода. Сравните с предыдущими примерами:<br /></p><div class="codebox"><pre><code>var fso = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;);

Enumerator.forItems(fso.Drives, function(drive)
    ...
})</code></pre></div><p>.<br /><strong>Enumerator.forItems</strong> принимает два аргумента: <br />-- коллекцию, элементы которой необходимо перебрать; <br />-- функцию, которая вызывается для каждого элемента коллекции. Аргументами функции являются текущий элемент коллекции и ссылка на коллекцию. В большинстве ситуацию достаточно указания одного аргумента. </p><p>Метод не возвращает результата. </p><p><strong>Enumerator.toArray</strong> преобразует коллекцию и возвращает массив.<br /><strong>Enumerator.toObject</strong> преобразует коллекцию и возвращает объект. </p><p>Эти методы избыточны, так как их функциональность полностью реализуема с помощью Enumerate.forItems. Однако они могут быть полезны в силу их интуитивной ясности в контексте использования. </p><div class="codebox"><pre><code>// Преобразовать коллекцию безымянных аргументов командной строки в массив
// Каждый аргумент доступен по его индексу, например, unnamed[0] - первый элемент
var unnamed = Enumerator.toArray(WScript.Arguments.Unnamed, function(value)
{
    return value;
});

// Преобразовать коллецию именованых аргументов командой строки 
// вида /ключ[:значение] в объект вида {&quot;ключ&quot;: &quot;значение&quot;} 
// &quot;значение&quot; программно доступно как named[&quot;ключ&quot;]
var named = Enumerator.toObject(WScript.Arguments.Named, function(key, collection)
{
    return {
        key: key, 
        value: collection.item(key)
    };
});</code></pre></div><p>.<br />Далее - исходный код расширения. Полная и актуальная версия доступна по адресу <a href="http://code.google.com/p/jsxt/source/browse/trunk/js/win32/Enumerator.js">http://code.google.com/p/jsxt/source/br … merator.js</a><br /></p><div class="codebox"><pre><code>Enumerator.toArray = function(collection, fun, thisp)
{
    if ( typeof fun != &quot;function&quot; ) {
        throw new TypeError();
    }

    var result = [];

    var fc = new Enumerator(collection);
    for ( ; ! fc.atEnd(); fc.moveNext()) {
        var i = fc.item();
        result.push(fun.call(thisp, i, collection));
    }

    return result;
};

Enumerator.toObject = function(collection, fun, thisp)
{
    if ( typeof fun != &quot;function&quot; ) {
        throw new TypeError();
    }

    var result = {};

    var fc = new Enumerator(collection);
    for ( ; ! fc.atEnd(); fc.moveNext()) {
        var i = fc.item();
        var r = fun.call(thisp, i, collection);
        result[r.key] = r.value;
    }

    return result;
};

Enumerator.forItems = function(collection, fun, thisp)
{
    if ( typeof fun != &quot;function&quot; ) {
        throw new TypeError();
    }

    var fc = new Enumerator(collection);
    for ( ; ! fc.atEnd(); fc.moveNext()) {
        var i = fc.item();
        fun.call(thisp, i, collection);
    }
};</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Wed, 13 Oct 2010 23:29:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=40419#p40419</guid>
		</item>
	</channel>
</rss>
