首页 > 解决方案 > 在打字稿中排序对象数组时出错,没有正确的顺序(使用 .slice() 工作)

问题描述

我有一个具有这种结构的对象数组:

let j=[
         {
            id: "924f8812-8520-41ac-b78b-8b8ea69dc169", 
            FechaHoraConexion: "2020-11-19 13:48:15",
            FechaHoraDesconexion: "2020-12-20 13:48:59"
          },
          {
            id: "e9f9d414-eba6-4af9-8a0f-4e2c9d2e4643", 
            FechaHoraConexion: "2020-11-19 13:50:27",
            FechaHoraDesconexion: "2020-11-19 13:48:15"
          },
          {
            id: "dbdbccf3-a820-49e0-93e6-fc392120cdb2",
            FechaHoraConexion: "2020-11-19 19:50:27",
            FechaHoraDesconexion: "2020-11-20 14:17:32"
           }
        ]
        let ascend=j.slice();
        let auxascend=ascend.sort(function (a, b) {
    if (a.FechaHoraConexion > b.FechaHoraConexion) {
      return 1;
    }
    if (a.FechaHoraConexion < b.FechaHoraConexion) {
      return -1;
    }
    return 0;
  });
  let ascend2=j.slice();
  let auxascend2=ascend2.sort(function (a, b) {
    if (a.FechaHoraDesconexion > b.FechaHoraDesconexion) {
      return 1;
    }
    if (a.FechaHoraDesconexion < b.FechaHoraDesconexion) {
      return -1;
    }
    return 0;
  });
 //THE RESULT IS THE SAME ARRAY WITH THE SAME ORDER BUT THE ASCEND ARRAY ORDER IS INCORRECT       
 console.log(auxascend,auxascend2)

acend2 数组是正确的,但无论出于何种原因,ascend 数组都等于ascend2 数组。是什么原因?。谢谢你的帮助。

标签: javascripttypescriptsorting

解决方案


您需要获取数组的副本并在没有相同对象引用的情况下对数组进行排序。

const
    sortBy = key => (a, b) => a[key].localeCompare(b[key]),
    array = [{ id: "924f8812-8520-41ac-b78b-8b8ea69dc169", FechaHoraConexion: "2020-11-19 13:48:15", FechaHoraDesconexion: "2020-12-20 13:48:59" }, { id: "e9f9d414-eba6-4af9-8a0f-4e2c9d2e4643", FechaHoraConexion: "2020-11-19 13:50:27", FechaHoraDesconexion: "2020-11-19 13:48:15" }, { id: "dbdbccf3-a820-49e0-93e6-fc392120cdb2", FechaHoraConexion: "2020-11-19 19:50:27", FechaHoraDesconexion: "2020-11-20 14:17:32" }]
    auxascend = [...array].sort(sortBy('FechaHoraConexion'));
    auxascend2 = [...array].sort(sortBy('FechaHoraDesconexion'));
     
console.log(auxascend);
console.log(auxascend2)
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读