обработка больших наборов данных в оптимизации JavaScript - PullRequest
0 голосов
/ 26 июня 2019

Я отправляю запрос на получение и получаю объект JSON с массивом около 50000 элементов. Мне нужно перебрать элементы массива 50000 и сгруппировать все элементы с одним и тем же именем пользователя, а затем добавить эти данные в другой массив в моем коде, чтобы они могли отображаться в сетке пользовательского интерфейса.

Мое первое решение состояло в том, чтобы пройтись по полученным 50000 элементам и проверить, были ли они в массиве ui-grid, что требовало от меня циклически проходить по массиву ui-grid, поэтому для каждого элемента в массиве из запроса GET я имел цикл по массиву пользовательского интерфейса. Если я нашел элемент в массиве ui-grid с тем же именем пользователя, то я просто добавил целочисленные значения вместе, т.е.

(uiGridArray [i] .views + = GetRequestArray [j] .views).

Моя вторая попытка, которую я пытался использовать, и массив значений ключей. Имена пользователей были ключевыми значениями. Я создал временный массив для их хранения. Я бы перебрал массив запросов GET, как и раньше, но вместо того, чтобы перебирать массив ui-grid для проверки имен пользователей, я сначала проверил бы, существует ли элемент со значением tempArray [GetRequestArray [i] .username], если бы я не создал его. если бы он существовал, я бы просто перешел к этому элементу, используя значение ключа, например

(tempArray [GetRequestArray [i] .username] .views + = GetRequestArray [i] .views)

Наконец, я бы однажды перебрал tempArray и добавил его в массив ui-grid.

GetRequestArray -> tempKeyNameArray -> uiGridArray

callAPI.get(options).then(function(value) {
          let dataLength = uiGrid.data.length;

          // formates data from the graylog query into an object and stores the formated
          // objects in a hash table to increase performace while formating the data
          for (let i = 0; i < value.length; i++) {
              $scope.addMessageToHashTableArray(value[i]);
          }

          // add clinical hash table to ui-grid data array
          for (let key in $scope.tempArray) {
            uiGrid.data.push($scope.tempArray[key]);
          }
      })


$scope.addMessageToHashTableArray = function(value) {

      let row = angular.copy($scope.templateRow);
      row.username = value.message.username;
      row.email = value.message.email;
      row.group = $scope.getGroupName(value.message);

      let key = row.username;

      // if a row already exists with the current username and group
      // then update that row with the current values
      if ($scope.tempArray.hasOwnProperty(key)) {
        $scope.tempArray[key].data_view += row.data_view;
        $scope.tempArray[key].records += row.records;
        $scope.tempArray[key].crosstabs += row.crosstabs;
        $scope.tempArray[key].explorer += row.explorer;
        $scope.tempArray[key].bookmarks += row.bookmarks;
        $scope.tempArray[key].reports += row.reports;
        $scope.tempArray[key].total_views += row.total_views;

      }
      // if the row does not exist then create one
      else {
        $scope.tempArray[key] = angular.copy(row);
      }
  }

Из моих тестов массив значений пары ключей казался на 4 секунды быстрее, но процесс все еще занимает 30-40 секунд. Есть ли способ, которым я могу оптимизировать это? Я бы хотел, чтобы процесс занимал 10 секунд, то есть сократил время загрузки на 20-30 секунд

...