Проблема со сравнением двух массивов и объединением на основе объединенного массива с различными объектами - PullRequest
0 голосов
/ 27 апреля 2020

Первоначально массив $scope.distinctCourseUsers будет пустым, после каждого динамического c нового ответа я добавляю все объекты в предыдущий список, включая новый набор объектов, а затем удаляю дубликаты массива с помощью метода Reduce и сохранение обратно в $scope.distinctCourseUsers

$scope.courseUsers = response;
Array.prototype.push.apply($scope.distinctCourseUsers,response); 
distinctCourseUsers = result = $scope.distinctCourseUsers.reduce((unique, o) => {
    if(!unique.some(obj => obj.Id === o.Id )) {
    unique.push(o);
    }
    return unique;
},[]);

$scope.courseUsers = response;

Для ответа I два новых объекта массива будут сохранены в $scope.courseUsers

console.log($scope.courseUsers);

(2) [{…}, {…}]
0: {Id: 22410, Name: "test01", RoleType: "XL Teacher", IsEnrolled: false, EnrolledOn: "", …}
1: {Id: 22411, Name: "test02", RoleType: "XL Teacher", IsEnrolled: false, EnrolledOn: "", …}

Слияние пустых $scope.distinctCourseUsers массив с ответом, хранящимся в $scope.courseUsers

Array.prototype.push.apply($scope.distinctCourseUsers,response); 
console.log($scope.distinctCourseUsers);

Для ответа II появятся два новых объекта, поэтому добавление предыдущего списка массивов (2) + (новый список массивов (2) + предыдущий список массивов) (4)) Всего (2 + 2 + 4 = 6) в список $scope.distinctCourseUsers массив

(4) [{…}, {…}, {…}, {…}]
0: {Id: 22410, Name: "test01", RoleType: "XL Teacher", IsEnrolled: false, EnrolledOn: "", …}
1: {Id: 22411, Name: "test02", RoleType: "XL Teacher", IsEnrolled: false, EnrolledOn: "", …}
2: {Id: 22410, Name: "test01", RoleType: "XL Teacher", IsEnrolled: false, EnrolledOn: "", …}
3: {Id: 22411, Name: "test02", RoleType: "XL Teacher", IsEnrolled: false, EnrolledOn: "", …}
4: {Id: 22412, Name: "test03", RoleType: "XL Teacher", IsEnrolled: false, EnrolledOn: "", …}
5: {Id: 22413, Name: "test04", RoleType: "End user", IsEnrolled: false, EnrolledOn: "", …}

// The below reduce opertator will eliminate all the redundant objects
distinctCourseUsers = result = $scope.distinctCourseUsers.reduce((unique, o) => {
    if(!unique.some(obj => obj.Id === o.Id )) {
    unique.push(o);
    }
    return unique;
},[]);


console.log(distinctCourseUsers);

Фактический и ожидаемый результат:

0: {Id: 22410, Name: "test01", RoleType: "XL Teacher", IsEnrolled: false, EnrolledOn: "", …}
1: {Id: 22411, Name: "test02", RoleType: "XL Teacher", IsEnrolled: false, EnrolledOn: "", …}
2: {Id: 22412, Name: "test03", RoleType: "XL Teacher", IsEnrolled: false, EnrolledOn: "", …}
3: {Id: 22413, Name: "test04", RoleType: "End user", IsEnrolled: false, EnrolledOn: "", …}

Приведенный выше подход неэффективен из-за снижения производительности, связанного с добавлением предыдущего списка объектов. Можно ли устранить дубликат в первом месте, указанном в приведенном ниже коде

Array.prototype.push.apply($scope.distinctCourseUsers,response); 

Как бы вы сократили код, чтобы сделать его достаточно эффективным, чтобы получить вышеуказанный результат?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...