Сравните значения внутри массива, вычислите их и объедините строки в таблице. - PullRequest
2 голосов
/ 22 июня 2019

В моем коде есть поле поиска, где пользователь может искать информацию о другом пользователе с помощью идентификатора.После завершения поиска система вернет массив $scope.mixedList.Это динамический массив и вывод может быть разным.

Мне нужно проверить:

if(cat_id == previous_cat_id && process_id == previous_process_id){
  summarize output;
  summarize achievement;
  merge rows in table;
}else{
  output = output;
  achievement = achievement;
  do not merge rows in table;
}

Для этого я создал функцию calculateCategory:

var cat_output = 0;
var cat_achievement = 0;
function calculateCategory(list) {
  if (list.length > 0) {
    list[0].OutAchCatRowMatch=false;
    for (var i = 0; i < list.length; i++) {
      var process_id = list[i].process_id;
      var cat_id = list[i].cat_id;
      var output = list[i].output;
      var achievement = list[i].achievement;

      var outp_rows = 1;
      for (var j = i + 1; j < list.length; j++) {
        if (process_id === list[j].process_id && cat_id === list[j].cat_id) {
          outp_rows++;
          cat_output = parseFloat(list[j].output) + parseFloat(output);
          cat_achievement = parseFloat(list[j].achievement) + parseFloat(achievement);
          list[j].OutAchCatRowMatch=true;
        }else{              
          cat_output = parseFloat(list[j].output);
          cat_achievement = parseFloat(list[j].achievement);  
          list[j].OutAchCatRowMatch=false;
          break;
        }
      }
      list[i].cat_output = cat_output;
      list[i].cat_achievement = cat_achievement;
      list[i].outp_rows = outp_rows;
    }
  }
}

Вот два примера вывода массиваи вывод html таблицы:

Первый результат должен быть с объединенными строками, а первая объединенная строка неверна:

$scope.mixedList = [
    { pcode: "ENC2", cat_id: "5", process_id: "4", output: "102", achievement: 33.55 },
    { pcode: "LMA", cat_id: "5", process_id: "4", output: "11", achievement: 3.62 },
    { pcode: "ENC2", cat_id: "5", process_id: "3", output: "92", achievement: 28.22 },
    { pcode: "LMA", cat_id: "5", process_id: "3", output: "11", achievement: 3.37 },
];

First row is wrong here

Второй массив не нужно объединять, потому что cat_id и process_id отличаются.Вот только беспорядок:

$scope.mixedList = [
    { pcode: "LMA KEY", cat_id: "7", process_id: "5", output: "5.13", achievement: 1.95 },
    { pcode: "TFY", cat_id: "8", process_id: "5", output: "50.64", achievement: 21.28 },
    { pcode: "LMA INB", cat_id: "7", process_id: "6", output: "5.13", achievement: 1.91 },
];

enter image description here

Что не так с моей функцией?Как я могу изменить его, чтобы он работал?

1 Ответ

3 голосов
/ 24 июня 2019

Проблема в коде - оператор else. Он должен вести себя по-разному в случае, если слияние происходит или нет.

Я изменил код для использования функции Map ниже (согласно моему пониманию вашего кода), чтобы кэшировать вычисленные данные и затем использовать их вместо этого. Дайте мне знать, если это поможет.

function calculateCategory(list) {
  var cache = new Map();
  if (list.length > 0) {
    list[0].OutAchCatRowMatch = false;
    var merge = false;
    for (var i = 0; i < list.length; i++) {
      var process_id = list[i].process_id;
      var cat_id = list[i].cat_id;
      var cat_output = list[i].output;
      var cat_achievement = list[i].achievement;
      var outp_rows = 1;

      var key = list[i].process_id + ":" + list[i].cat_id;
      if (cache.has(key)) {
        var cachedValues = cache.get(key);
        list[i].cat_output = cachedValues.cat_output;
        list[i].cat_achievement = cachedValues.cat_achievement;
        list[i].outp_rows = cachedValues.outp_rows;
      } else {
        for (var j = i + 1; j < list.length; j++) {
          if (process_id === list[j].process_id && cat_id === list[j].cat_id) {
            outp_rows++;
            cat_output = parseFloat(list[j].output) + parseFloat(cat_output);
            cat_achievement = parseFloat(list[j].achievement) + parseFloat(cat_achievement);
            list[j].OutAchCatRowMatch = true;
          }
        }
        cache.set(key, {
          "cat_output": cat_output,
          "cat_achievement": cat_achievement,
          "outp_rows": outp_rows
        });
        list[i].cat_output = cat_output;
        list[i].cat_achievement = cat_achievement;
        list[i].outp_rows = outp_rows;
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...