Я отправляю запрос на получение и получаю объект 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 секунд