Как получить сумму значений определенных ключей из массива объектов

#javascript #arrays #iteration

Вопрос:

У меня есть похожий на следующий массив объектов:

 let violation = [  {  "timestamp": 1637658787661,  "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7",  "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5",  "message": "CreateHarshAccelerationEvent",  "value": 71,  },  {  "timestamp": 1637658789678,  "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7",  "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5",  "message": "CreateHarshDecelerationEvent",  "value": 50,  },  {  "timestamp": 1637659776571,  "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7",  "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5",  "message": "CreateIdlingEvent",  "value": 0,  },  {  "timestamp": 1637660707375,  "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7",  "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5",  "message": "CreateSpeedingEvent",  "value": 67,  },  {  "timestamp": 1637661519707,  "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7",  "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5",  "message": "CreateHarshAccelerationEvent",  "value": 71,  },  {  "timestamp": 1637661521773,  "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7",  "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5",  "message": "CreateHarshDecelerationEvent",  "value": 50,  },  {  "timestamp": 1637661548282,  "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7",  "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5",  "message": "CreateSpeedingEvent",  "value": 62,  },  {  "timestamp": 1637663230199,  "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7",  "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5",  "message": "CreateSpeedingEvent",  "value": 66,  },  .....  .....  ]  

Таким образом, здесь каждый объект будет иметь message свойство или ключ одного из четырех значений, а именно CreateHarshAccelerationEvent , CreateHarshDecelerationEvent , CreateSpeedingEvent , CreateIdlingEvent .

Здесь мне нужно получить общее количество каждого ключа. т. е. общее количество CreateHarshAccelerationEvent и общее количество CreateHarshDecelerationEvent и общее количество CreateIdlingEvent и общее количество CreateSpeedingEvent

Но условие, при котором я должен выбрать объект для total с идентификатором, и этот идентификатор представляет собой комбинацию идентификатора водителя и компании, т. е. key = company "/" driver

Для этого я выполняю следующий код

 var violations = []   for (let violation of data){  var key  if ( (violation.company) amp;amp; (violation.driver) ) {   key = violation.company   "/"   violation.driver;   let violationType = violation.message;    violations[key].company = violation.company;  violations[key].driver = violation.driver;    }   }   console.log(violations);  

Мне нужен результат, как

 [{  "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7",  "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5",  "CreateHarshAccelerationEvent": "total number of values CreateHarshAccelerationEvent from Array of objects basis on the basis of that custom key i.e. company/driver value",  "CreateHarshDecelerationEvent": "total number of values CreateHarshDecelerationEvent from Array of objects basis on the basis of that custom key i.e. company/driver value",  "CreateIdlingEvent": "total number of values CreateIdlingEvent from Array of objects basis on the basis of that custom key i.e. company/driver value",  "CreateSpeedingEvent": "total number of values CreateSpeedingEvent from Array of objects basis on the basis of that custom key i.e. company/driver value",  }]  

Комментарии:

1. В чем именно заключается ваш вопрос здесь? Что не работает? Или вы просто ищете другие подходы?

2. Мне нужно получить общее значение CreateHarshAccelerationEvent, CreateHarshDecelerationEvent, CreateSpeedingEvent, CreateIdlingEvent в соответствии с пользовательским уникальным идентификатором в результате объекта. Я обновил вопрос

Ответ №1:

Array.reduce я тебе помогу.

 let violation = [ { "timestamp": 1637658787661, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5", "message": "CreateHarshAccelerationEvent", "value": 71, }, { "timestamp": 1637658789678, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5", "message": "CreateHarshDecelerationEvent", "value": 50, }, { "timestamp": 1637659776571, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5", "message": "CreateIdlingEvent", "value": 0, }, { "timestamp": 1637660707375, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5", "message": "CreateSpeedingEvent", "value": 67, }, { "timestamp": 1637661519707, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5", "message": "CreateHarshAccelerationEvent", "value": 71, }, { "timestamp": 1637661521773, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5","message": "CreateHarshDecelerationEvent", "value": 50, }, { "timestamp": 1637661548282, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5", "message": "CreateSpeedingEvent", "value": 62, }, { "timestamp":1637663230199, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5", "message": "CreateSpeedingEvent", "value": 66, }]; const result = violation.reduce((acc, curr) =gt; {  const node = acc.find(item =gt; item.driver === curr.driver amp;amp; item.company === curr.company);  if (node) node[curr.message] ? node[curr.message]  = curr.value : node[curr.message] = curr.value  else  acc.push({  driver: curr.driver,  company: curr.company,  [curr.message]: curr.value  });  return acc; }, []); console.log(result); 

Ответ №2:

У вас есть ошибка в вашем подходе. Вы не можете использовать строку в качестве ключа в массиве, поэтому вам нужно изменить ее на объект const violations = {}

Кроме того, прежде чем вы это violations[key].speeding сделаете, убедитесь, что инициализировано как 0, потому что вы пытаетесь ввести undefined значение здесь

Ответ №3:

Вы можете использовать array#reduce для подведения итогов разных событий для одного driver и company того же и.

 let violation = [ { "timestamp": 1637658787661, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5", "message": "CreateHarshAccelerationEvent", "value": 71, }, { "timestamp": 1637658789678, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5", "message": "CreateHarshDecelerationEvent", "value": 50, }, { "timestamp": 1637659776571, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5", "message": "CreateIdlingEvent", "value": 0, }, { "timestamp": 1637660707375, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5", "message": "CreateSpeedingEvent", "value": 67, }, { "timestamp": 1637661519707, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5", "message": "CreateHarshAccelerationEvent", "value": 71, }, { "timestamp": 1637661521773, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5","message": "CreateHarshDecelerationEvent", "value": 50, }, { "timestamp": 1637661548282, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5", "message": "CreateSpeedingEvent", "value": 62, }, { "timestamp":1637663230199, "driver": "7f5fda5d-86a8-471e-ae32-fcc39deb8fc7", "company": "9d8616dd-4689-4689-8812-a2345ccdcfc5", "message": "CreateSpeedingEvent", "value": 66, }],  result = Object.values(violation.reduce((r, o) =gt; {  const key = o.driver   '_'   o.company;  r[key] ??= {driver: o.driver, company: o.company};  r[key][o.message] = (r[key][o.message] ?? 0)   o.value;  return r;  },{})); console.log(result);