javascript 枚舉值label、value映射轉換工具函數

function createEnumItem(label, value, ...others) {
    if (others && others.length > 0) {
        return {label, value, others};
    }
    return {label, value};
}

function formatEnumObject(originEnumObject) {

    if (!originEnumObject) {
        return {};
    }

    if (Array.isArray(originEnumObject)) {
        const enumObject = {};
        for (let i = 0; i < originEnumObject.length; i++) {
            const item = originEnumObject[i];
            if (typeof item === "string" || typeof item === "number" || typeof item === 'boolean') {
                enumObject[i] = createEnumItem(item, item);
            } else if (typeof item === "object") {
                enumObject[i] = item;
            }
        }
        return enumObject;
    }

    if (typeof originEnumObject === "object") {
        const enumObject = {};
        const keys = Object.keys(originEnumObject);
        for (let i = 0; i < keys.length; i++) {
            const key = keys[i];
            const item = originEnumObject[key];
            if (typeof item === "string") {
                enumObject[key] = createEnumItem(item, key);
            } else if (typeof item === "object") {
                enumObject[key] = item;
            }
        }
        return enumObject;
    }

    return {};
}

function createEnum(originEnumObject) {

    const enumObject = formatEnumObject(originEnumObject);

    const NAMES = {
        KEY: '@@key',
        ITEM: '@@@item',
    };

    const getItemAttr = (item, key, attrName) => {
        if (attrName === NAMES.KEY) {
            return key;
        }
        if (attrName === NAMES.ITEM) {
            return item;
        }
        return item[attrName];
    }

    const getMapInner = (keyName, valueName) => {
        const map = {};
        const keys = Object.keys(enumObject);
        for (let i = 0; i < keys.length; i++) {
            const key = keys[i];
            const item = enumObject[key] || {};
            const mapKeyPt = getItemAttr(item, key, keyName);
            map[mapKeyPt] = getItemAttr(item, key, valueName);
        }
        return map;
    }


    // 自帶緩存,避免重複計算。
    const cacheObject = {};
    const getMap = (keyName = 'value', valueName = 'label') => {
        const cacheKey = `${keyName}_${valueName}`;
        if (!cacheObject[cacheKey]) {
            cacheObject[cacheKey] = getMapInner(keyName, valueName);
        }
        return cacheObject[cacheKey];
    }

    const getArray = ()=>{
        return Object.values(enumObject);
    }

    return {
        getValueKeyMap: () => getMap('value', NAMES.KEY),
        getValueLabelMap: () => getMap('value', 'label'),
        getValueItemMap: () => getMap('value', NAMES.ITEM),

        getLabelValueMap: () => getMap('label', 'value'),
        getLabelKeyMap: () => getMap('label', NAMES.KEY),
        getLabelItemMap: () => getMap('label', NAMES.ITEM),

        getKeyValueMap: () => getMap(NAMES.KEY, 'value'),
        getKeyLabelMap: () => getMap(NAMES.KEY, 'label'),
        getKeyItemMap: () => enumObject,
        getMap,
        getArray,
    };
}


var demo1 = createEnum({
    PENDING: createEnumItem("處理中", "1"),
    AGREE: createEnumItem("已同意", "2"),
    REJECT: createEnumItem("已拒絕", "3"),
    FINISH: createEnumItem("已完成", "4"),
    CLOSED: createEnumItem("已關閉", "5"),
});


var demo2 = createEnum({
    PENDING: "處理中",
    AGREE: "已同意",
    REJECT: "已拒絕",
    FINISH: "已完成",
    CLOSED: "已關閉",
});


var demo3 = createEnum({
    PENDING1: {aa: "處理中1", bb: '1'},
    PENDING2: {aa: "處理中2", bb: '2'},
    PENDING3: {aa: "處理中3", bb: '3'},
    PENDING4: {aa: "處理中4", bb: '4'},
});

demo3.getMap('bb', 'aa');
demo3.getMap('@@key', 'aa');

var demo4 = createEnum([
    {aa: "處理中1", bb: '1'},
    {aa: "處理中2", bb: '2'},
    {aa: "處理中3", bb: '3'},
    {aa: "處理中4", bb: '4'},
]);

demo4.getMap('aa','bb');
demo4.getMap('bb','aa');

var demo5 = createEnum([
    '1','2','3','4'
]);
demo5.getArray();
demo5.getMap();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章