Ask a Question

Loop/iterate over dictionary

SOLVED
newbiexiii
New Contributor

Loop/iterate over dictionary

I created a dictionary as follows and would like to loop over it and perform some actions.

 

var dict = new ActiveXObject("Scripting.Dictionary");

dict.add("a",1);

dict.add("b",2);

dict.add("c",3);

for (var key in dict){

 Log.message("key is "+key+" and value is "+dict[key])

}

 

But the program does not enter the loop.

How can i iterate over the dictionary in Testcomplete using Jscript?

4 REPLIES 4
AlexKaras
Champion Level 2

Hi,

 

Try

for (var key in dict.keys)

 

Does it help?

 

Regards,
  /Alex [Community Champion]
____
[Community Champions] are not employed by SmartBear Software but
are just volunteers who have some experience with the tools by SmartBear Software
and a desire to help others. Posts made by [Community Champions]
may differ from the official policies of SmartBear Software and should be treated
as the own private opinion of their authors and under no circumstances as an
official answer from SmartBear Software.
The [Community Champion] signature is assigned on quarterly basis and is used with permission by SmartBear Software.
https://community.smartbear.com/t5/Community-Champions/About-the-Community-Champions-Program/gpm-p/252662
================================

It enters the loop but when it try to access the values it shows up as undefined

var dict = new ActiveXObject("Scripting.Dictionary");
dict.add("a",1);
dict.add("b","2");
dict.add("c","3");

var keys = dict.Keys();
Log.Message("the keys are "+keys[0]); -----> prints undefined
var typeIs = typeof keys;
Log.Message("the type of keys is "+typeIs) -----------> prints undefined

for(var i=0; i<dict.Count; i++){
Log.Message("inside for loop");
Log.Message("key is "+keys[i]+" and value is "+sessionsData[keys[i]]); ---------> prints key is undefined and value is undefined
}

KseniaSemina
SmartBear Alumni (Retired)

Hi,

I am not familiar with Dictionary, but I found one example:
//JScript
function ItemsDemo()
{
var a, d, i, s; // Create some variables.
d = new ActiveXObject("Scripting.Dictionary");
d.Add ("a", "Athens"); // Add some keys and items.
d.Add ("b", "Belgrade");
d.Add ("c", "Cairo");
a = (new VBArray(d.Items())).toArray(); // Get the items.
s = "";
for (i in a) // Iterate the dictionary.
{
s += a[i] + "<br>";
}
return(s); // Return the results.
}

It appears that in your code the part to create an array with the needed items is missing.
I've tried to modify your code and here is what I've got:
function DictTest() {
var dict, ar, typeIs, i
dict = new ActiveXObject("Scripting.Dictionary");
dict.add("a", 1);
dict.add("b","2");
dict.add("c","3");

ar = (new VBArray(dict.Items())).toArray()

for(i in ar) {
Log.Message("inside for loop");
Log.Message("the keys are "+ar[i]);
var typeIs = typeof ar[i];
Log.Message("the type of keys is "+ typeIs)
}
}
It looks pretty fine on playback and you can find the results in the screenshot below:

KseniaSemina_0-1617195421418.png


Does it help?

Thanks

Jochen
New Member

Hi, 

I verified this solution: it is bit more convenient:

function ItemsDemo()
{
var a, d, i, s; // Create some variables.
d = new getActiveXObject("Scripting.Dictionary");
d.Add ("a", "Athens"); // Add some keys and items.
d.Add ("b", "Belgrade");
d.Add ("c", "Cairo");
d.Items().toArray().forEach(eachItem => {Log.Message(eachItem)})
d.Keys().toArray().forEach(eachItem => {Log.Message(eachItem)})
}

cancel
Showing results for 
Search instead for 
Did you mean: