对象数组格式化的问题?

现有一数组格式为:

oldArr: [
    {letter: 'A', word: '安利'},
    {letter: 'A', word: 'Apple'},
    {letter: 'A', word: '阿文土司'},
    {letter: 'B', word: 'BLUE'},
    {letter: 'B', word: 'blood'},
    {letter: 'C', word: '吃饭'},
    {letter: 'C', word: '蹭蹭上涨'},
    {letter: 'C', word: 'Cat'},
    {letter: 'C', word: '策划'},
    {letter: 'C', word: '穿女装'},
    {letter: 'D', word: '蝶恋花'},
    {letter: 'D', word: '大美女'},
    ...
]

如何将其格式化为

newArr: [
    {
        letter: 'A',
        children: [
            {word: '安利'},
            {word: 'Apple'},
            {word: '阿文土司'},
        ]
    },
    {
        letter: 'B',
        children: [
            {word: 'BLUE'},
            {word: 'blood'}
        ]
    },
    {
        letter: 'C',
        children: [
            {word: '吃饭'},
            {word: '蹭蹭上涨'},
            {word: 'Cat'},
            {word: '策划'},
            {word: '穿女装'}
        ]
    },
    {
        letter: 'D',
        children: [
            {word: '蝶恋花'},
            {word: '大美女'}
        ]
    },
    ...
]

现有方法:
先从oldArr中提取出letterArr: ['A', 'B', 'C'...]
然后再用oldArr中每个元素去匹配letterArr,最终输出newArr,但是这样太耗时了。

原数据长度或有数千,如何最快格式化为想要的格式?

阅读 1.1k
1 个回答
const oldArr =  [
    {letter: 'A', word: '安利'},
    {letter: 'A', word: 'Apple'},
    {letter: 'A', word: '阿文土司'},
    {letter: 'B', word: 'BLUE'},
    {letter: 'B', word: 'blood'},
    {letter: 'C', word: '吃饭'},
    {letter: 'C', word: '蹭蹭上涨'},
    {letter: 'C', word: 'Cat'},
    {letter: 'C', word: '策划'},
    {letter: 'C', word: '穿女装'},
    {letter: 'D', word: '蝶恋花'},
    {letter: 'D', word: '大美女'},
]

const targetMap = new Map()
const target = []

oldArr.forEach(({letter, word}) => {
    let arr = [];
    targetMap.set(letter, arr = (targetMap.get(letter) || []))
    arr.push(word)
})

targetMap.forEach((key, value) =>{
    target.push({
        letter: key,
        children: value
    })
})

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