export default {
    set(object, path, value) {
        if (typeof object !== "object") return object;
        this.basePath(path).reduce((o, k, i, _) => {
            if (i === _.length - 1) {
                // 若遍历结束直接赋值
                o[k] = value;
                return null;
            } else if (k in o) {
                // 若存在对应路径，则返回找到的对象，进行下一次遍历
                return o[k];
            } else {
                // 若不存在对应路径，则创建对应对象，若下一路径是数字，新对象赋值为空数组，否则赋值为空对象
                o[k] = /^[0-9]{1,}$/.test(_[i + 1]) ? [] : {};
                return o[k];
            }
        }, object);
        // 返回object
        return object;
    },

    basePath(path) {
        // 若是数组，则直接返回
        if (Array.isArray(path)) return path;
        // 若有 '[',']'，则替换成将 '[' 替换成 '.',去掉 ']'
        return path.replace(/\[/g, ".").replace(/\]/g, "").split(".");
    },

    get(object, path, defaultValue) {
        // 判断 object 是否是数组或者对象，否则直接返回默认值 defaultValue
        if (typeof object !== "object") return defaultValue;

        // 沿着路径寻找到对应的值，未找到则返回默认值 defaultValue
        return (
            this.basePath(path).reduce((o, k) => (o || {})[k], object) || defaultValue
        );
    }
}