我正在发送一个get请求,并接收一个带有约50000个元素的数组的JSON对象。我需要遍历50000个数组元素并将所有具有相同用户名的元素组合在一起,然后将该数据添加到代码中的另一个数组中,以便可以在UI网格中显示。
我的第一个解决方案是遍历接收到的50000个元素,并检查它们是否在ui-grid数组中,这需要我遍历ui-grid数组,因此对于来自GET请求的数组中的每个元素遍历ui-grid数组。如果我在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秒