代码之家  ›  专栏  ›  技术社区  ›  Kevin.a

按日期对数组排序意外结果

  •  -1
  • Kevin.a  · 技术社区  · 5 年前

    我有一个数组包含日期,有时不包含:

    const activities = [
        { title: 'Hikin'},
      { title: 'Hiking', date: '2020-12-23' },
      { title: 'Shopping', date: '2020-12-18' },
    ]
    

    const activities = [
        { title: 'Hikin'},
      { title: 'Hiking', date: '2020-12-23' },
      { title: 'Shopping', date: '2020-12-18' },
    ]
    
    const sortedActivities = activities.sort((a, b) => new Date(b.date)  - new Date(a.date))
    
    console.log(sortedActivities.map(item => {
        return item.title;
    }))

    但问题是,没有日期的项目总是排在首位。我希望有日期的项目优先于不包含日期值的项目。

    4 回复  |  直到 5 年前
        1
  •  0
  •   Harinder Singh    5 年前

    更改排序函数中的比较方法。这样地:

    activities.sort((a, b) => {
      if (!a.date) return 1;
      if (!b.date) return -1;
      return new Date(b.date) - new Date(a.date);
    });
    
        2
  •  1
  •   Mujibur Rehman Ansari Sadegh Ghafari Yazdi    5 年前

    我做的是先删除日期,然后应用过滤器,最后我只是合并排序的数据和没有日期的数据。

    const activities = [
      { title: 'Hikin'},
      { title: 'Hiking', date: '2020-12-23' },
      { title: 'Shopping', date: '2020-12-18' },
    ];
    
    const activitesWithoutDate = activities.filter(a => a.date === undefined);
    const activitesWithDate = activities.filter(a => a.date !== undefined);
    
    const sortedActivities = activitesWithDate.sort((a, b) => new Date(b.date)  - new Date(a.date));
    
    console.log([...sortedActivities, ...activitesWithoutDate].map(item => item.title ));
        3
  •  1
  •   Alan Omar    5 年前

    epoch point 作为没有 date 属性:

     const activities = [
        { title: 'Hikin'},
        { title: 'Hiking', date: '2020-12-23' },
        { title: 'Shopping', date: '2020-12-18' },
     ]
    
     const sortedActivities = activities.sort((a, b) => new Date(b.date || '1970-01-01')  - new Date(a.date||'1970-01-01'))
    
     console.log(sortedActivities.map(item => {
    return item.title;
    }))
    
        4
  •  1
  •   Adnan Ahmed    5 年前
    const activities = [
        { title: 'Hikin'},
        { title: 'Hiking', date: '2020-12-23' },
        { title: 'Hikin2'},
        { title: 'Shopping', date: '2020-12-18' },
        { title: 'Hikin3'},
    ]
    
    const sortedActivities = activities.sort((a, b) => {
        if(!b.date && !a.date) { return 0 }; // if both don't have date do not sort.
        if(!b.date) { return -1 }; // a comes first
        if(!a.date) { return 1 }; // b comes first
        let calValue = new Date(b.date)  - new Date(a.date); 
        return calValue;
    })
    
    console.log(sortedActivities.map(item => {
        return item.title;
    }))
    
        5
  •  -1
  •   kuka0len    5 年前

    const activities = [
      { title: "Hikin" },
      { title: "Hiking", date: "2020-12-23" },
      { title: "Shopping", date: "2020-12-18" },
    ];
    
    const sortedActivities = activities.sort(
      (a, b) => new Date(b.date) - new Date(a.date) || -Infinity
    );
    
    console.log(
      sortedActivities.map((item) => {
        return item.title;
      })
    );