AngularJS中angular.copy失效及选择排序异常问题求助
嘿,我来帮你一步步搞定这两个问题!先从你更着急的排序问题说起~
1. 修复排序逻辑问题
你现在的排序逻辑出错,核心原因是直接比较字符串格式的日期。比如"20/04/2020"和"19/04/2020",字符串比较是按字符顺序来的,虽然这次结果看似正确,但如果遇到"05/05/2020"和"10/04/2020",字符串比较会认为"10..."更大,但实际日期是05/05更晚,完全不对。另外你还硬编码了索引[2],如果数组长度变化,这个索引就失效了。
下面是修复后的排序代码,我给你标了关键修改点:
$scope.sortedArrayEvent = function(){ // 先写个辅助函数,把DD/MM/YYYY格式的字符串转成Date对象(注意月份是0开始的) function parseDate(dateStr) { const [day, month, year] = dateStr.split('/'); return new Date(year, month - 1, day); } // 测试用的硬编码数组(后续可以换成angular.copy的逻辑) $scope.arrayReminder =[ {reminderName:"green",reminderTime:"06:00:00",reminderDate:"19/04/2020"}, {reminderName:"yellow",reminderTime:"07:00:00",reminderDate:"20/04/2020"}, {reminderName:"blue",reminderTime:"08:00:00",reminderDate:"18/04/2020"} ]; let index = $scope.arrayReminder.length; // 选择排序:找日期最新的条目,放到数组末尾(或者你可以改成从大到小排序) for(let i =0;i<index-1;i++){ let maxIndex =i; // 改成找最大的日期索引,而不是最小 for (let j = i+1; j<index; j++){ // 用Date对象比较,确保日期逻辑正确 if (parseDate($scope.arrayReminder[j].reminderDate) > parseDate($scope.arrayReminder[maxIndex].reminderDate)){ maxIndex = j; } } // 交换位置,把最新的日期移到当前循环的最后 let temp = $scope.arrayReminder[maxIndex]; $scope.arrayReminder[maxIndex] = $scope.arrayReminder[index - 1 - i]; $scope.arrayReminder[index - 1 - i] = temp; } // 循环结束后再赋值,用动态索引取最后一个(最新的条目) $scope.sortedArray = [{ sortedEventName: $scope.arrayReminder[index - 1].reminderName, sortedEventTime: $scope.arrayReminder[index - 1].reminderTime, sortedEventDate: $scope.arrayReminder[index - 1].reminderDate, }]; }
关键修改说明:
- 新增
parseDate函数,把字符串日期转成可比较的Date对象 - 把排序逻辑改成找最大日期的索引,确保最新的条目被放到数组最后
- 用
index - 1动态获取最新条目,不再硬编码索引[2] - 把
sortedArray的赋值移到循环外面,避免重复赋值
2. 解决angular.copy数组复制问题
你说angular.copy($scope.arrayEvent)无法复制到$scope.arrayReminder,大概率是这两个原因:
- 调用
sortedArrayEvent时,$scope.arrayEvent还没初始化(比如是异步加载的数据,比如从API获取,这时候arrayEvent还是undefined或者空数组) - 不小心重复声明了函数(你的代码里写了两次
$scope.sortedArrayEvent = function(){,这是笔误,必须删掉重复的那一行)
修复方案:
$scope.sortedArrayEvent = function(){ // 先确保arrayEvent是有效的数组,再执行复制 if ($scope.arrayEvent && Array.isArray($scope.arrayEvent)) { $scope.arrayReminder = angular.copy($scope.arrayEvent); console.log('复制成功:', $scope.arrayReminder); } else { console.warn('arrayEvent不是有效的数组,无法复制,请检查它的初始化时机'); // 可以留着测试数组作为 fallback $scope.arrayReminder =[ {reminderName:"green",reminderTime:"06:00:00",reminderDate:"19/04/2020"}, {reminderName:"yellow",reminderTime:"07:00:00",reminderDate:"20/04/2020"}, {reminderName:"blue",reminderTime:"08:00:00",reminderDate:"18/04/2020"} ]; } // 下面是之前修复好的排序逻辑... function parseDate(dateStr) { const [day, month, year] = dateStr.split('/'); return new Date(year, month - 1, day); } let index = $scope.arrayReminder.length; for(let i =0;i<index-1;i++){ let maxIndex =i; for (let j = i+1; j<index; j++){ if (parseDate($scope.arrayReminder[j].reminderDate) > parseDate($scope.arrayReminder[maxIndex].reminderDate)){ maxIndex = j; } } let temp = $scope.arrayReminder[maxIndex]; $scope.arrayReminder[maxIndex] = $scope.arrayReminder[index - 1 - i]; $scope.arrayReminder[index - 1 - i] = temp; } $scope.sortedArray = [{ sortedEventName: $scope.arrayReminder[index - 1].reminderName, sortedEventTime: $scope.arrayReminder[index - 1].reminderTime, sortedEventDate: $scope.arrayReminder[index - 1].reminderDate, }]; }
额外提示:如果arrayEvent是异步加载的(比如从后端获取),要确保在数据加载完成后再调用sortedArrayEvent,比如在$http的then回调里调用。
内容的提问来源于stack exchange,提问作者Prasadika
相关产品推荐
相关产品推荐

