请问如何将这样的一个数组结构转成对象


数据是这样的

const data=[
    '第一章 开始A',
    '第一节 开始1',
    '1.0 开始1.0',
    '1.0.1 开始1.01',
    '1.1 开始1.1',
    '1.2 开始1.2',
    '1.2.1 开始1.2.1',
    '1.2.2 开始1.2.2',
    '1.2.3 开始1.2.3',
    '1.3 开始1.3',
    '第二节 开始2',
    '2.0 开始2.0',
    '2.1 开始2.1',
    '2.1.1 开始2.1.1',
    '第二章 开始B',
    '第一节 开始1',
    '1.0 开始1.0',
    '1.0.1 开始1.01',
    '1.1 开始1.1'
]

需要转成这样

const obj={
    '开始A':{
        '开始1':{
            '开始1.0':['开始1.01'],
            '开始1.1':[],
            '开始1.2':['开始1.2.1','开始1.2.2','开始1.2.3'],
            '开始1.3':[]
        },
        '开始2':{
            '开始2.0':[],
            '开始2.1':['开始2.1.1']
        }
    },
    '开始B':{
        '开始1':{
            '开始1.0':['开始1.01'],
            '开始1.1':[]
        }
    }
}
阅读 1.3k
1 个回答

const numberMap = [..."一二三四五六七八九十"]
    .reduce((map, c, i) => {
        map[c] = i + 1;
        return map;
    }, {});

let chapter = null;
let result = {};
let cache = {};
data.forEach(line => {
    const [number, title] = line.split(" ", 2);
    if (/章/.test(number)) {
        const n = numberMap[number.substr(1, 1)];    // 只处理了章号只有一个中文数字的情况
        chapter = n;
        const current = cache[`${n}/`] = {};
        result[title] = current;
    } else if (/节/.test(number)) {
        const n = numberMap[number.substr(1, 1)];   // 节号也只处理了一个中文数字的情况
        const current = cache[`${chapter}/${n}`] = {};
        cache[`${chapter}/`][title] = current;
    } else if (number.split(".").length === 2) {
        const[section] = number.split(".");
        const current = cache[`${chapter}/${number}`] = [];
        cache[`${chapter}/${section}`][title] = current;
    } else {
        const [section, sub] = number.split(".");
        cache[`${chapter}/${section}.${sub}`].push(title);
    }
});

注意,上面的代码中,对中文数字的转换只处理了一位中文数字,如果超过“十”需要使用专业的转换函数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题