Как уникально и суммировать значения на основе ключа свойства - PullRequest
2 голосов
/ 20 января 2020

У меня есть массив данных объекта из моей базы данных, вот мои данные:

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 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 key.

Есть решение? Спасибо.

Ответы [ 2 ]

1 голос
/ 21 января 2020

Я бы использовал loadsh groupBy и sumBy, чтобы упростить задачу. как то так

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);

1 голос
/ 21 января 2020

В зависимости от вашего подхода: вам просто нужно «изменить» 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)
...