You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,大概率是这两个原因:

  1. 调用sortedArrayEvent时,$scope.arrayEvent还没初始化(比如是异步加载的数据,比如从API获取,这时候arrayEvent还是undefined或者空数组)
  2. 不小心重复声明了函数(你的代码里写了两次$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:32:31