鍍金池/ 問答/HTML/ 字符串模板與對象轉(zhuǎn)換

字符串模板與對象轉(zhuǎn)換

字符串

| Str | String | 字符串 | mock1 |
| `message` | Object | 消息 | mock2 |
| `message.data` | Object | 消息2 | mock3 |
| `message.data.data2` | Object | 消息3 | mock4 |

我希望得到的格式.多少層級不確定。求解決方法或思路。

{
      Str: {
        mock: 'mock1',
        must: 1,
        remark: '字符串',
        type: 'String'
      },
      message: {
        data: {
          data2: {
            mock: 'mock4',
            must: 1,
            remark: '消息3',
            type: 'Object'
          },
          mock: 'mock3',
          must: 1,
          remark: '消息2',
          type: 'Object'
        },
        mock: 'mock2',
        must: 1,
        remark: '消息',
        type: 'Object'
      }
    }
回答
編輯回答
冷溫柔

不是太清楚題主的需求,也沒考慮其他情況,大概寫了一下,僅供參考。

假設(shè)把你的字符串作為一個數(shù)組輸入,每一行字符串就是數(shù)組的一個元素

function parse(obj, str){
    let [key, type, remark, mock] = str.split('|').filter(i => i);
    key = key.trim().replace(/`/g,'');
    type = type.trim();
    remark = remark.trim();
    mock = mock.trim();
    const keyArr = key.split('.');
    generateObj(obj, keyArr, {
        type,
        remark,
        mock
    });
}

function generateObj(obj, keyArr, info){
    let tmpObj = obj;
    const len = keyArr.length;
    keyArr.forEach((key, idx) => {
        tmpObj[key] = tmpObj[key] || {};
        if(idx === len - 1){
            tmpObj[key] = {
                ...tmpObj[key],
                ...info,
                must: 1
            }
        }
        tmpObj = tmpObj[key];
    });
}

// 主函數(shù)
function process(strArr) {
    if (!strArr) return;
    const res = {};
    strArr.forEach(item => {
        parse(res, item);
    });
    return res;
}

const input = ['| Str | String | 字符串 | mock1 |', 
'| `message` | Object | 消息 | mock2 |', 
'| `message.data` | Object | 消息2 | mock3 |', 
'| `message.data.data2` | Object | 消息3 | mock4 |'];

console.log(process(input));
2017年1月21日 04:42