So, I have no clue why you want to do what you say you want to do, and I hope you will fill us all in, but this code should be close enough for you to be able to tweak it (this is based on some code of mine that I use to find differences in JavaScript object graphs):
function doStrangeThing(obj) {
var propertyChanges = [];
var objectGraphPath = [];
(function(obj, refObj) {
if ( obj.constructor == Object || (obj.constructor != Number &&
obj.constructor != String && obj.constructor != Date && obj.constructor != Boolean &&
obj.constructor != RegExp && obj.constructor != Function)) {
for (var property in obj) {
objectGraphPath.push((objectGraphPath.length > 0) ? "[" + property + "]" : property);
if (obj[property].constructor != Function) {
if (!refObj[property]) refObj[property] = {};
arguments.callee(obj[property], refObj[property]);
}
objectGraphPath.pop();
}
} else if (obj.constructor != Function) {
if (obj != refObj) {
propertyChanges.push("\"" + objectGraphPath.join("") + "\":\"" + obj.toString() + "\"");
}
}
})(obj, {});
return "{" + propertyChanges.join(",") + "}";
}
Here is what I did to test it:
doStrangeThing({'a':{'b':{'c':'1200'}}, 'z':'foo', 'bar':{'baz':'1', 'id':2}});
Which results in this value:
{"a[b][c]":"1200","z":"foo","bar[baz]":"1","bar[id]":"2"}
Hope that is useful to you in some way...