Javascript Data Structures - a collection object
Javascript Data Structures - a collection object
Written by Ian Elliot   
Thursday, 22 September 2016
Article Index
Javascript Data Structures - a collection object
Enumerators

Banner

Enumeration

Now we come to the tricky problem of enumerating a collection. You clearly cannot just use for in on the collection object e.g.

for(index in myCol)
{
 alert(myCol[index]);
}

This works but it displays the properties and methods of myCol not the collection it contains.

One solution is to enumerate the collection property:

for (index in myCol.collection)
{
 alert(myCol.item(index));
}

This has the advantage the the for in is used but the disadvantage that the user has to remember to use the collection property. It also doesn't work if you want the collection property to be inaccessible.

Perhaps the time has come to give up enumeration using for in and provide an enumeration method. There are ways to create very general enumeration methods that can be run on any object but there are advantages to creating custom enumeration methods for each type of data object you create. So let's add a ForEach method to the collection object:

this.forEach=function(block)
  {
   for (key in this.collection){
    if(this.collection.hasOwnProperty(key))
    {
     block(this.collection[key]);
    }
  }
}

The basic idea is that the enumerator is passed a block of code i.e. a function that it will execute once for each item in the collection. The item in question is passed to the block of code as the first parameter.

The way that this works is that a standard for in loop is used to step though the properties of the collection. Just in case someone has added properties and methods to the prototype of the collection we check that each key corresponds to an own property i.e. not provided by a prototype object. In most cases this should be unnecessary but it is included to show how the approach could be made defensive. A better defence would be to make collection private.

Finally the block of code is called with the item as the first parameter. Notice that the code block doesn't run in the context of the collection object i.e. it can't make use of this and it can't be a method belonging to another object. This might seem restrictive but the idea is that the block of code is passed to the enumerator as if it was a lambda expression or a Ruby block. For example:

myCol.forEach(
function(item)
{
  alert(item);
});

The function is called once with item set to each item in the collection. Notice that you don't have to name the first parameter item and the function can have as many lines as it needs.

You can modify the forEach to pass the item and key if that would be more useful and you can drop the restriction on using methods by changing the call to the block of code to block.call(object,item) where object is that object that the method belongs to passed into the forEach.

An alternative approach is to implement an enumerator function which simply returns the next value. This involves keeping track of where you are in the enumeration. There are no obvious easy ways to do this in pre-ES2005 JavaScript. 

Once you have seen how a collection object can be implemented it is fairly easy to customise and extend to other collection subtypes. 

 datastruct

 


JavaScript Data Structures 

Cover

Contents

  1. The Associative Array
  2. The String Object*
  3. The Array object
  4. Typed Arrays I*
  5. Typed Arrays II*
  6. Speed dating - the art of the JavaScript Date object
  7. Doing JavaScript Date Calculations*
  8. A Time Interval Object*
  9. Collection Object
  10. Stacks, Queue & Deque
  11. The Linked List*
  12. A Lisp-like list*
  13. The Binary Tree
  14. Bit manipulation*
  15. Active Logic, Truthy and Falsey *
  16. Master JavaScript Regular Expressions*

 

 

 

To be informed about new articles on I Programmer, install the I Programmer Toolbar, subscribe to the RSS feed, follow us on, Twitter, FacebookGoogle+ or Linkedin,  or sign up for our weekly newsletter.

 

Banner
 


jQuery 3 - Promises, Deferred & WebWorkers

It is fairly easy to consume promises returned by asynchronous functions that other programmers have put together for you. It is only a little more difficult to use promises to create your own asynchr [ ... ]



JavaScript Async - Events

JavaScript is an asynchronous language - what exactly does this mean? We delve into events to find out how this basic behavior affects the way JavaScript works and how best to think about it. Asynchro [ ... ]


Other Articles

 
 

 

blog comments powered by Disqus

 

<ASIN:0596806752>

<ASIN:0321812182>

<ASIN:1491901888>

<ASIN:144934013X>

<ASIN:193398869X>

<ASIN:1449373216>



Last Updated ( Thursday, 27 October 2016 )
 
 

   
Banner
RSS feed of all content
I Programmer - full contents
Copyright © 2017 i-programmer.info. All Rights Reserved.
Joomla! is Free Software released under the GNU/GPL License.