function detype(ent, tree = {}, dict = {}, prev = "") {
if(check(ent,{},[])) ent = Object.entries(ent)
for(let [key,val] of ent) {
let path = [prev,!isNaN(key) ? `[${key}]` : key].join(prev && isNaN(key) ? '.' : '')
let desc = {prop: key, type:Object.prototype.toString.call(val)}
if (check(val, {}, [], new Map)) {
tree[path] = {}
dict[path] = desc
detype(val, tree[path], dict, path)
} else { tree[path] = dict[path] = desc }
} return new Map(Object.entries(dict))
}