const DEFAULT_OPTIONS = {
    idKey: 'id',
    pIdKey: 'pId',
    childrenKey: 'children',
    type: 'nested',
    data: []
};
function Tree(options) {
    this.options = {
        ...DEFAULT_OPTIONS,
        ...options,
    };
    const { type, data } = options;
    this.data = [
        ...this.parse(type, data)
    ];
}
Tree.prototype.parse = function () {
    return this[arguments[0] + 'Parser'].call(this, arguments[1]);
};
Tree.prototype.nestedParser = function (data) {
    const ret = deepFirstRecursive.call(this, data);
    return ret;
    /**
     * 深度优先
     *       +-D
     *   +-B-|
     * A-|   +-E
     *   +-C-F
     *
     * 找到 B 节点后把 B 作为父节点，children 数组作为数据，进入下次递归
     */
    function deepFirstRecursive(data, pItem, unique) {
        pItem = pItem || null;
        unique = unique || { id: 1 };
        let result = [];
        data.forEach((item) => {
            const tmpItem = {
                ...item
            };
            // 没有唯一标志时增加一个
            if (tmpItem[this.options.idKey] == null) {
                tmpItem[this.options.idKey] = unique.id++;
            }
            // 没有对父节点的引用关系时增加一个
            if (pItem && tmpItem[this.options.pIdKey] == null) {
                tmpItem[this.options.pIdKey] = pItem[this.options.idKey];
            }
            result.push(tmpItem);
            if (tmpItem[this.options.childrenKey] && tmpItem[this.options.childrenKey].length) {
                const children = tmpItem[this.options.childrenKey];
                tmpItem[this.options.childrenKey] = children.map((child) => {
                    return child[this.options.idKey];
                });
                const restList = deepFirstRecursive.call(this, children, tmpItem, unique);
                result = result.concat(restList);
            }
        });
        return result;
    }
};
Tree.prototype.getData = function () {
    return this.data;
};
Tree.prototype.flattenedParser = function (data) {
    let result = data.concat();
    data.forEach((item) => {
        if (item[this.options.pIdKey]) {
            result = result.map((tmpItem) => {
                if (tmpItem[this.options.idKey] === item[this.options.pIdKey]) {
                    return {
                        ...tmpItem,
                        [this.options.childrenKey]: [
                            ...(tmpItem[this.options.childrenKey] || [])
                        ].concat(item[this.options.idKey])
                    };
                }
                else {
                    return tmpItem;
                }
            });
        }
    });
    return result;
};
export default Tree;
//# sourceMappingURL=Tree.js.map