【问题标题】:How to unique and sum the values based on the property key如何根据属性键对值进行唯一和求和
【发布时间】:2020-01-21 05:37:36
【问题描述】:

我的数据库中有一组对象数据,这是我的数据:

const data = [
  {
    'partnerId': 1,
    'partnerName': 'Company1',
    'timeInt': 0,
    'duration': '0 days',
    'statusRanking': 'equal',
    'totalProject': 2
  },
  {
    'partnerId': 2,
    'partnerName': 'Company2',
    'timeInt': 0,
    'duration': '0 days',
    'statusRanking': 'equal',
    'totalProject': 1
  },
  {
    'partnerId': 2,
    'partnerName': 'Company2',
    'timeInt': 2,
    'duration': '2 days',
    'statusRanking': 'equal',
    'totalProject': 2
  },
  {
    'partnerId': 1,
    'partnerName': 'Company1',
    'timeInt': 3,
    'duration': '3 days',
    'statusRanking': 'equal',
    'totalProject': 5
  },
  {
    'partnerId': 2,
    'partnerName': 'Company2',
    'timeInt': 5,
    'duration': '5 days',
    'statusRanking': 'equal',
    'totalProject': 2
  },
  {
    'partnerId': 1,
    'partnerName': 'Company1',
    'timeInt': 18,
    'duration': '18 days',
    'statusRanking': 'equal',
    'totalProject': 6
  }
];

我怎样才能使它们独一无二?(基于 partnerId 键的唯一性)然后根据 timeInt 和 totalProject 键求和?

预期结果:

const data = [
  {
    'partnerId': 1,
    'partnerName': 'Company1',
    'timeInt': 21,
    'duration': '21 days',
    'statusRanking': 'equal',
    'totalProject': 13
  },
  {
    'partnerId': 2,
    'partnerName': 'Company2',
    'timeInt': 7,
    'duration': '7 days',
    'statusRanking': 'equal',
    'totalProject': 5
  }
];

我已经试过了:

let a = data.reduce((acc, x) => acc.concat(acc.find(y => y.partnerId === x.partnerId) ? [] : [x]), []);

但这只是为了唯一,而不是求和 timeInt 和 totalProject 键。

有什么解决办法吗? 谢谢。

【问题讨论】:

    标签: javascript arrays node.js ecmascript-6 reduce


    【解决方案1】:

    根据您的方法:您只需在将x 插入数组之前“更改”它,使用reduce 总结您所需的属性(时间/项目):

    const data = [{
        'partnerId': 1,
        'partnerName': 'Company1',
        'timeInt': 0,
        'duration': '0 days',
        'statusRanking': 'equal',
        'totalProject': 2
      },
      {
        'partnerId': 2,
        'partnerName': 'Company2',
        'timeInt': 0,
        'duration': '0 days',
        'statusRanking': 'equal',
        'totalProject': 1
      },
      {
        'partnerId': 2,
        'partnerName': 'Company2',
        'timeInt': 2,
        'duration': '2 days',
        'statusRanking': 'equal',
        'totalProject': 2
      },
      {
        'partnerId': 1,
        'partnerName': 'Company1',
        'timeInt': 3,
        'duration': '3 days',
        'statusRanking': 'equal',
        'totalProject': 5
      },
      {
        'partnerId': 2,
        'partnerName': 'Company2',
        'timeInt': 5,
        'duration': '5 days',
        'statusRanking': 'equal',
        'totalProject': 2
      },
      {
        'partnerId': 1,
        'partnerName': 'Company1',
        'timeInt': 18,
        'duration': '18 days',
        'statusRanking': 'equal',
        'totalProject': 6
      }
    ]
    
    let a = data.reduce((acc, x) => {
      if(acc.find(y => y.partnerId === x.partnerId)) return acc.concat([]);
      const timeInt = data.filter(y => y.partnerId === x.partnerId).map(y => y.timeInt).reduce((a, b) => a + b, 0);
      const totalProject = data.filter(y => y.partnerId === x.partnerId).map(y => y.totalProject).reduce((a, b) => a + b, 0);
      return acc.concat([{
        ...x,
        timeInt,
        totalProject,
        duration: timeInt + ' days'
      }])}, []);
    
    console.log(a)

    【讨论】:

      【解决方案2】:

      我会使用loadshgroupBysumBy 来简化任务。像这样的

      const {groupBy, sumBy} = require("lodash");
      const data = [
        {
          "partnerId": 1,
          "partnerName": "Company1",
          "timeInt": 0,
          "duration": "0 days",
          "statusRanking": "equal",
          "totalProject": 2
        },
        {
          "partnerId": 2,
          "partnerName": "Company2",
          "timeInt": 0,
          "duration": "0 days",
          "statusRanking": "equal",
          "totalProject": 1
        },
        {
          "partnerId": 2,
          "partnerName": "Company2",
          "timeInt": 2,
          "duration": "2 days",
          "statusRanking": "equal",
          "totalProject": 2
        },
        {
          "partnerId": 1,
          "partnerName": "Company1",
          "timeInt": 3,
          "duration": "3 days",
          "statusRanking": "equal",
          "totalProject": 5
        },
        {
          "partnerId": 2,
          "partnerName": "Company2",
          "timeInt": 5,
          "duration": "5 days",
          "statusRanking": "equal",
          "totalProject": 2
        },
        {
          "partnerId": 1,
          "partnerName": "Company1",
          "timeInt": 18,
          "duration": "18 days",
          "statusRanking": "equal",
          "totalProject": 6
        }
      ];
      
      
      const unique = groupBy(data, i => i.partnerId);
      
      const result = Object.keys(unique).map(key => {
        const first = unique[key][0];
        return {
          ...first,
          "timeInt": sumBy(unique[key], i => i.timeInt),
          "totalProject": sumBy(unique[key], i => i.totalProject)
        };
      });
      
      console.log(result);
      
      

      【讨论】:

      • 哇!这也是一个简单的方法!谢谢@Ashish Modi
      • @masdap 很高兴它有帮助。我始终相信,如果一个库可以让我们轻松生活并且代码干净,我们应该使用它。随意将其标记为其他人参考的答案。
      猜你喜欢
      • 2020-02-06
      • 2016-01-16
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 2022-10-25
      • 2022-01-23
      • 2017-09-26
      • 2021-12-29
      相关资源
      最近更新 更多