可以使用reduce()方法和对象来实现:

let result = {};
arr.reduce((acc, cur) => {
  if (cur.name in acc) {
    if (cur.type in acc[cur.name]) {
      acc[cur.name][cur.type]++;
    } else {
      acc[cur.name][cur.type] = 1;
    }
  } else {
    acc[cur.name] = {};
    acc[cur.name][cur.type] = 1;
  }
  return acc;
}, result);

for (let name in result) {
  console.log(`name: ${name}`);
  let total = 0;
  for (let type in result[name]) {
    total += result[name][type];
  }
  for (let type in result[name]) {
    let percentage = (result[name][type] / total * 100).toFixed(2);
    console.log(`type: ${type}, percentage: ${percentage}%`);
  }
}

输出结果为:

name: m1
type: Frame_Shit_del, percentage: 33.33%
type: Messense_Mutation, percentage: 33.33%
type: In_Frame_Del, percentage: 33.33%
name: m2
type: Frame_Shit_del, percentage: 50.00%
type: Splite_Site, percentage: 25.00%
type: Nonsense_Mutation, percentage: 25.00%

其中,result对象的结构为:

{
  "m1": {
    "Frame_Shit_del": 1,
    "Messense_Mutation": 1,
    "In_Frame_Del": 1
  },
  "m2": {
    "Frame_Shit_del": 2,
    "Splite_Site": 1,
    "Nonsense_Mutation": 1
  }
}

可以看到,result对象保存了每个name下每个type值出现的次数。通过遍历result对象,可以计算出每个type值所占的比例。

let arr = name m1 groupName group1 type Frame_Shit_del name m1 groupName group2 type Messense_Mutation

原文地址: http://www.cveoy.top/t/topic/XWt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录