问题描述
这样的对象数组
const data = [
{'name': 'apple','type': 'fruit','quantity': 5},{'name': 'orange','quantity': 8},{'name': 'broccoli','type': 'vegetable',...
]
对于 type
的每个唯一值,我需要返回一个数组,如
output = [
{
'field': 'fruit','count': 2,'minQuantity': 5,'maxQuantity': 8,'values': ['apple','orange']
},{
'field': 'vegetable','count': 1,'maxQuantity': 5,'values': ['broccoli']
}
]
有没有简单/有效的方法来做到这一点?
到目前为止我尝试过的:
let returnData = [];
let fieldSet = new Set(data.map(a => a.type));
let fields = Array.from(fieldSet);
for (var i = 0; i < fields.length; i++) {
let objs = data.filter(obj => {
return obj.type === fields[i]
})
returnData.push({
field: fields[i],count: objs.length
})
}
解决方法
您可以先使用 Array.prototype.reduce
按类型对数据进行分组,然后使用 Object.entries
和 Array.prototype.map
将对象转换为数组。
const data = [
{'name': 'apple','type': 'fruit','quantity': 5},{'name': 'orange','quantity': 8},{'name': 'broccoli','type': 'vegetable',];
const EMPTY_GROUP = {
minQuantity: Infinity,maxQuantity: -Infinity,count: 0,values: []
};
const dataGroupedByType = data.reduce((result,item) => {
const { name,type,quantity } = item;
result[type] = result[type] || EMPTY_GROUP;
const group = result[type];
result[type] = {
minQuantity: Math.min(group.minQuantity,quantity),maxQuantity: Math.max(group.maxQuantity,count: group.count + 1,values: [...group.values,name]
};
return result;
},{});
const result = Object.entries(dataGroupedByType).map(([type,group]) => ({
field: type,...group
}));
console.log(result);