问题描述
deserialization([0, 'a', 1, 'b', 2, 'c', 3, 'e', 2, 'd', 1, 'x', 0, 'ff'])
=>
{
a: {
b: {
c: {
e: null
},
d: null
},
x: null
},
ff: null
}
function deserialization(targets) {
const _isEmpty = Symbol('isempty');
const _top = Symbol('top');
const _endTag = Symbol('#');
Array.prototype[_isEmpty] = function () { return this.length === 0 };
Array.prototype[_top] = function () { return this.length > 0 ? this[this.length - 1] : undefined };
targets = targets.concat([-1, _endTag]);
let levelstack = [{ level: -2 }], objStack = [Object.create(null)];
for (let i = 0; i < targets.length; i += 2) {
let level = targets[i], key = targets[i + 1];
while (!levelstack[_isEmpty]()) {
let top = levelstack[_top]();
if (top.level >= level) {
let key = levelstack.pop()['key'];
let topObj = objStack.pop();
if (Object.keys(topObj).length === 0) {
let topObj = objStack[_top]();
topObj[key] = null;
}
}
else {
if (key === _endTag) break;
let parent = objStack[_top]();
parent[key] = Object.create(null)
objStack.push(parent[key])
levelstack.push({ key, level })
break;
}
}
}
return objStack[0];
}