JavaScript反序列化数组到对象

514 阅读1分钟

问题描述

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];
}

image.png