cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Browse apps to extend the software in the new JMP Marketplace
Choose Language Hide Translation Bar
FN
FN
Level VI

Inserting additional values to existing keys in associative arrays (data dictionaries in JSL)

I cannot find the proper method to add new values to existing keys in associative arrays.

 

Names Default To Here( 1 );

ex = Associative Array();

ex["a"] = {"10"};
ex["b"] = {"20"};
ex["c"] = {"30"};

// Add new value to "b" ex["b"] = {"21"}; show(ex); //ex = ["a" => {"10"}, "b" => {"21"}, "c" => {"30"}]; // Solution needed //ex = ["a" => {"10"}, "b" => {"20", "21"}, "c" => {"30"}];
1 ACCEPTED SOLUTION

Accepted Solutions
Craige_Hales
Super User

Re: Inserting additional values to existing keys in associative arrays (data dictionaries in JSL)

Complete example, including the obvious way that does not work correctly.

// I wish the default value for AA's worked correctly with a list for the
// default, but it does not:
aa = [=> {}];
Insert Into( aa["fred"], 1 );
Insert Into( aa["ralph"], 2 );
Show( aa ); // aa = [=> {1, 2}]; ?!?!?!?!

// so you must do an explicit test and create the key/list like this:
aa = [=> ];
For( i = 1, i <= 3, i += 1,
	For Each( {key}, {"fred", "ralph"},
		If( !(aa << Contains( key )), // key does not exist?
			aa[key] = {};// add the key with an empty list
		);
		Insert Into( aa[key], i );// insert into list
	)
);
Show( aa ); // aa = ["fred" => {1, 2, 3}, "ralph" => {1, 2, 3}];
Craige

View solution in original post

7 REPLIES 7

Re: Inserting additional values to existing keys in associative arrays (data dictionaries in JSL)

Treat the value ex["b"] like any other list.

 

Names Default To Here( 1 );

ex = Associative Array();

ex["a"] = {"10"};
ex["b"] = {"20"};
ex["c"] = {"30"};
// Add new value to "b"
Insert Into( ex["b"], {"21"} );

Show( ex );
Craige_Hales
Super User

Re: Inserting additional values to existing keys in associative arrays (data dictionaries in JSL)

Mark's answer is the best. You can also do it like this

ex["c"][nitems(ex["c"])+1]="99";

which is uglier, slower, and less concise. But it might suggest other possibilities. Lists have a cool subscripting property for one-beyond-the-end that allows extending the list by one element.

 

Craige
FN
FN
Level VI

Re: Inserting additional values to existing keys in associative arrays (data dictionaries in JSL)

I am actually using something more like this, so I guess I am missing an evaluation of the variable:

 

 

Names Default To Here( 1 );

ex = Associative Array();

a_s = "a";
b_s = "b";
c_s = "c";

a_n = "10";
b_n = "20";
c_n = "30";

ex[a_s] = {a_n};
ex[b_s] = {b_n};
ex[c_s] = {c_n};
// Add new value to "b"

b_n = "21";
Insert Into( ex[b_s], {b_n} );

Show( ex );
// ex = ["a" => {a_n}, "b" => {b_n, b_n}, "c" => {c_n}];

 

 

vince_faller
Super User (Alumni)

Re: Inserting additional values to existing keys in associative arrays (data dictionaries in JSL)

The definition of list says that they aren't evaluated.  

List: Creates a list of items without evaluating them. 

Just wrap them in evallist()

 

 

Names Default To Here( 1 );

ex = Associative Array();

a_s = "a";
b_s = "b";
c_s = "c";

a_n = "10";
b_n = "20";
c_n = "30";

ex[a_s] = Evallist({a_n});
ex[b_s] = Evallist({b_n});
ex[c_s] = Evallist({c_n});
// Add new value to "b"

b_n = "21";
Insert Into( ex[b_s], Evallist({b_n}) );
// or you could this it seems easier. // Insert Into( ex[b_s], b_n) ;
Show( ex );
Vince Faller - Predictum
FN
FN
Level VI

Re: Inserting additional values to existing keys in associative arrays (data dictionaries in JSL)

This works, but if a given key is not existing, then I cannot insert new elements into it.

Regardless if the key is already there or not, is there a simple way to either introduce a new key-->value or insert a new value?

 

 

Craige_Hales
Super User

Re: Inserting additional values to existing keys in associative arrays (data dictionaries in JSL)

I think you'll need to use an if statement to check if the key exists and create it if it doesn't. I usually do this by creating it with an empty list, then fall into the code that adds the new element to the existing list.
Craige
Craige_Hales
Super User

Re: Inserting additional values to existing keys in associative arrays (data dictionaries in JSL)

Complete example, including the obvious way that does not work correctly.

// I wish the default value for AA's worked correctly with a list for the
// default, but it does not:
aa = [=> {}];
Insert Into( aa["fred"], 1 );
Insert Into( aa["ralph"], 2 );
Show( aa ); // aa = [=> {1, 2}]; ?!?!?!?!

// so you must do an explicit test and create the key/list like this:
aa = [=> ];
For( i = 1, i <= 3, i += 1,
	For Each( {key}, {"fred", "ralph"},
		If( !(aa << Contains( key )), // key does not exist?
			aa[key] = {};// add the key with an empty list
		);
		Insert Into( aa[key], i );// insert into list
	)
);
Show( aa ); // aa = ["fred" => {1, 2, 3}, "ralph" => {1, 2, 3}];
Craige