猿问

按键对对象数组进行分组,其中键是数组

我们可以通过对象的键来实现对对象数组的分组,其中键也是一个数组吗?


[

    {

        "name": "Apple",

        "tags": ["fruits"]

    },

    {

        "name": "Orange",

        "tags": ["fruits"]

    },

    {

        "name": "Tomato",

        "tags": ["fruits", "vegetables"]

    }

]

分组后的对象中想要的结果:


{

    "fruits": [

        {

            "name": "Apple",

            "tags": ["fruits"]

        },

        {

            "name": "Orange",

            "tags": ["fruits"]

        },

        {

            "name": "Tomato",

            "tags": ["fruits", "vegetables"]

        }

    ],

    "vegetables": [

        {

            "name": "Tomato",

            "tags": ["fruits", "vegetables"]

        }

    ]

}

非常欢迎 Vanilla 或 Lodash 解决方案!


编辑


谢谢大家,这是我最终使用的:


const groupBy = key => array =>

    array.reduce((obj, el) => {

        el[key].forEach(k => {

            obj[k] = obj[k] || []

            obj[k].push({ ...el })

        })

        return obj

    }, {})


const groupBySomething = groupBy(`something`)

const grouped = groupBySomething(data)


慕莱坞森
浏览 122回答 3
3回答

GCT1015

这使用Array.prototype.reduce和Array.prototype.forEach{  const data = [    {        "name": "Apple",        "tags": ["fruits"]    },    {        "name": "Orange",        "tags": ["fruits"]    },    {        "name": "Tomato",        "tags": ["fruits", "vegetables"]    }  ]   const groupedData = data.reduce((carry, element) => {    element.tags.forEach(tag => {      carry[tag] = carry[tag] || []      carry[tag].push({...element})    })    return carry;   }, {})    console.log(groupedData)}

茅侃侃

这里:let arr = [    {        "name": "Apple",        "tags": ["fruits"]    },    {        "name": "Orange",        "tags": ["fruits"]    },    {        "name": "Tomato",        "tags": ["fruits", "vegetables"]    }];let response = {};for(let i of arr){  for(let j of i.tags){     let tags =[...i.tags]     if(response[j]){        response[j].push({...i , tags: tags})     } else{        response[j] = [{...i, tags: tags}];     }  }}console.log(response)

呼如林

输入数据:const data = [    {        "name": "Apple",        "tags": ["fruits"]    },    {        "name": "Orange",        "tags": ["fruits"]    },    {        "name": "Tomato",        "tags": ["fruits", "vegetables"]    }];const convertData = data.reduce((target, currentElem) => {        currentElem.tags.forEach(tag => {            target[tag] ? target[tag].push({...currentElem}) : target[tag] = [{...currentElem}];        });        return target;}, {});console.log(convertData);
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答