I am looking for an elegant way to invert a JSON object's structure with variable depth like described below from a
to b
in Javascript ES6.
var a = {
"cookie": {
"CookieMessage": {
"DE": "Nachricht",
"EN": "Message"
}
};
var b = {
"DE": {
"cookie": {
"CookieMessage": "Nachricht"
}
},
"EN": {
"cookie": {
"CookieMessage": "Message"
}
}
};
In Python i would do something like this, which is not very elegant as well:
def find(root=[], obj=None):
ret = []
for k, v in obj.items():
if isinstance(v, dict):
newroot = []
newroot.extend(root)
newroot.append(k)
ret.extend(find(root=newroot, obj=v))
else:
copy = [k]
copy.extend(root)
ret.append((copy, v))
return ret
def invert(obj=None):
ret = {}
f = find(obj=obj)
for p, v in f:
old = ret
for n in p[:-1]:
if n not in old:
old[n] = {}
old = old[n]
old[p[-1]] = v
return ret
a = {
"cookie": {
"CookieMessage": {
"DE": "Nachricht",
"EN": "Message"
},
"CookieSorte": {
"DE": "Keks",
"EN": "Coook"
}
}
}
print(invert(a))
Which results in:
{
'DE': {
'cookie': {
'CookieSorte': 'Keks',
'CookieMessage': 'Nachricht'
}
},
'EN': {
'cookie': {
'CookieSorte': 'Coook',
'CookieMessage': 'Message'
}
}
}