[英]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.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) }
@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.