У тебя просто подгорело, когда ты понял, что вся эта каша с переливанием пропертей вообще не нужна. Типа а-чо-такова что дохера лишних кодов, подумаешь там несколько десятков байт уедут, но анальная фиксация дала знать - оставленный id тебе сразу бросился в глаза.
Короче, полюби уже себя, делай для себя как лучше, а лучше - это значит лучше, а не как получилось из-за незнания как делается. Делается вообще просто. На сервере формируешь массив и выдаешь его в json или xml браузеру, тот передает скрипту - втыкай и не надо молотить.
Из БД получается индексный массив, ну так на сервере профтыкай в него идешники и все. Например на пехепе.
$assoc=array();
$rows = $db->query('select * from `messages` where 1')->fetch_all(MYSQLI_ASSOC); /* или какой у тебя драйвер бд */
foreach($rows as $row)
$assoc[$row['id']]=$row;
echo json_encode($assoc);
exit;
В браузере просто сразу рендеришь, скажем
var el;
for(var id in json)
if(el=wrapper.querySelector('#'.id))
edit_post(json[id]);
/*
а вот тут скажи мне брат, как edit_post() узнает про id,
если его нет внутри объекта? Если id нет внутри,
тебе придется передавать его как дополнительный
аргумент фкнкции, а зачем? Понял зачем id внутри?
*/
else
create_post(json[id]);
Потому что "модель" уже сделана на сервере.