It would take some work to get an object setup the way you're suggesting, and it would be kind of restrictive as whenever a player changed their name, you'd have to change your script. Better to deal with the player's unique id, and to do it indirectly. For example: on('ready', ()=>{
const getPlayers = () => findObjs({type:'player'});
const getCharactersForPlayer = (playerid) =>
findObjs({
type: 'character'
}).filter( (c) =>
c.get('controlledby').split(/,/).includes(playerid) ||
c.get('controlledby').split(/,/).includes('all')
);
const getPlayerCharacterMap = () =>
getPlayers().reduce( (m, p) => Object.assign(m,{[p.id]:{player:p,characters:getCharactersForPlayer(p.id)}}),{});
let lookup = getPlayerCharacterMap();
on('chat:message',(msg) => {
if('api'===msg.type && /^!chars\b/.test(msg.content)){
let who=(getObj('player',msg.playerid)||{get:()=>'API'}).get('_displayname');
sendChat('',`/w "${who}" Your character's names are: ${(lookup[msg.playerid]||{characters:[]}).characters.map((c)=>c.get('name'))}`);
}
});
});
Run this !chars to be whispered a list of the names of all the characters you control.