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

3lxsmp7m  于 2021-09-23  发布在  Java
关注(0)|答案(1)|浏览(455)

我有一个对象数组,比如

const data = [
  {'name': 'apple', 'type': 'fruit', 'quantity': 5},
  {'name': 'orange', 'type': 'fruit', 'quantity': 8},
  {'name': 'broccoli', 'type': 'vegetable', 'quantity': 5},
  ...
]

对于每个唯一的 type 我需要返回一个数组,如

output = [
  {
    'field': 'fruit', 
    'count': 2,
    'minQuantity': 5,
    'maxQuantity': 8,
    'values': ['apple', 'orange'] 
  },
  {
    'field': 'vegetable',
    'count': 1,
    'minQuantity': 5,
    '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
  })
}
erhoui1w

erhoui1w1#

您可以先使用 Array.prototype.reduce ,然后使用 Object.entriesArray.prototype.map 可以将对象转换为数组。

const data = [
  {'name': 'apple', 'type': 'fruit', 'quantity': 5},
  {'name': 'orange', 'type': 'fruit', 'quantity': 8},
  {'name': 'broccoli', 'type': 'vegetable', 'quantity': 5},
];

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, quantity),
    count: group.count + 1,
    values: [...group.values, name]
  };
  return result;
}, {});

const result = Object.entries(dataGroupedByType).map(([type, group]) => ({
  field: type,
  ...group
}));

console.log(result);

相关问题