JavaScript: дедупликация и подсчет свойств массива - PullRequest
0 голосов
/ 17 апреля 2020

Работа с массивами - определенно одна из моих самых слабых сторон, поэтому любая помощь очень ценится. 100

Чтобы добавить в вызов, это для приложения WebOS, которое имеет следующие ограничения ...

  • JavaScript 5.0
  • Только дополнительная библиотека JQuery
  • Нет функций стрелок (=>)

Пример полученного массива ...

var Schedule = [{
  "category": "Laboratory", "status": "COMPLETE" }, {
  "category": "Radiology" , "status": "COMPLETE" }, {
  "category": "Laboratory", "status": "SCHEDULED"}, {
  "category": "Laboratory", "status": "COMPLETE" }, {
  "category": "Radiology" , "status": "SCHEDULED"}, {
  "category": "Laboratory", "status": "COMPLETE" }, {
  "category": "Doppler"   , "status": "SCHEDULED"
}]

Желаемое преобразование ...

var ScheduleFormatted = [{
  "category": "Laboratory", "complete": "3", "total": "4" }, {
  "category": "Radiology" , "complete": "1", "total": "2" }, {
  "category": "Doppler"   , "complete": "1", "total": "1" }, {
}]

Было бы особенно здорово, если бы неполные категории были указаны первыми.

Мне удалось достичь некоторых частей этого (например, получение уникальных свойств или подсчет экземпляров по статусу), но сложность этого делает меня совершенно тупым.

Пожалуйста, помогите.

1 Ответ

1 голос
/ 19 апреля 2020

Вы можете создавать поисковые объекты, где вы сохраняете общее / законченное количество для каждой категории:

 var total = {}, complete = {};

 Schedule.forEach(function(item) {
    var c = item.category;
    total[c] = (total[c] || 0) + 1;
    if(item.status === "COMPLETED") 
      complete[c] = (complete[c] || 0) + 1;
 });

 var ScheduleFormatted = Object.keys(total).map(function(category) {
    return { 
     category: category, 
     total: "" + total[category],
     complete: "" + (complete[category] || 0)
   };
 });
...