JavaScript 获取与另一个字段集中的每个值对应的字段值数组

问题描述

我有一个

这样的对象数组
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.entriesArray.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);