thank you both for your help.
So i have played around with all these approaches - and had trouble using both controls and localstorage because i am mapping to a list item with multiple rows. I'm sure it could be done, but I was more interested in the explanation in the link provided regarding how multiple mappings are handled. Obviously, why have multiple mappings if only the last one is relevant? well, apparently all the mappings are passed as separate calls to the javascript in the order the mappings are added. So in my case, I was able to add firstname and lastname mappings to the same destination control - and I added this javascript:
var result = "";
if (element.text().trim().length === 0)
{
result = value;
}
else
{
result = element.text() + " at " + value;
}
return result;
For the first call, the control was always empty (though I had to use the trim() because it contained 29 spaces every time - not sure why. it may have been an artifact of having a default value and then removing it). Then the second time, it had content/length, so I could handle the value as the second mapping value.
Hopefully this helps others understand how to use multiple mappings - especially in a list item situation where controls and localstorage can get complicated.
thanks again!