繁体   English   中英

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

[英]Group array of objects by key where key is an array

我们可以通过对象的键在对象数组上实现 group by 键也是一个数组吗?

[
    {
        "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"]
        }
    ]
}

非常欢迎香草或 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)

这里:

 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)

这使用Array.prototype.reduceArray.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) }

@yunzen 版本稍微简洁一点的版本。

输入数据:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM