在 JavaScript 中按日期或布尔值对 JSON 对象数组进行排序

Sorting JSON object array by date or boolean in JavaScript

我是 JavaScript 的新手,我有一组 JSON 个具有某些属性的对象。我想按日期属性对其进行排序,该属性可以是日期或布尔值。我想举个例子可以帮助您理解我的问题。

[
    {
        "name":"Name 1",
        "photoUrl":"URL",
        "date" : false,
        "bool": false
    },
    {
        "name":"Name2",
        "photoUrl":"URL",
        "date" : false,
        "bool": false
    },
    {
        "name":"Name 3",
        "photoUrl":"URL",
        "date" : "1.6. 2020",
        "bool": true
    },
    {
        "name":"Name 4",
        "photoUrl":"",
        "date" : "25.9. 2020",
        "bool": true
    },
{
        "name":"Name 5",
        "photoUrl":"",
        "date" : "29.8. 2020",
        "bool": true
    },
{
        "name":"Name 6",
        "photoUrl":"",
        "date" : "4.7. 2020",
        "bool": true
    },
{
        "name":"Name 7",
        "photoUrl":"",
        "date" : "25.6. 2020",
        "bool": true
    },
{
        "name":"Name 8",
        "photoUrl":"",
        "date" : "22.2. 2021",
        "bool": true
    },
]

我可以随意更改数据结构。 基本上,我希望日期不为假的那些在我的数组顶部并按日期排序(最新的在最上面),然后是日期为假的那些,但我找不到方法来做到这一点。

非常感谢您的帮助。

var ls = [
            {
                "name":"Name 1",
                "photoUrl":"URL",
                "date" : false,
                "bool": false
            },
            {
                "name":"Name2",
                "photoUrl":"URL",
                "date" : false,
                "bool": false
            },
            {
                "name":"Name 3",
                "photoUrl":"URL",
                "date" : "1.6. 2020",
                "bool": true
            },
            {
                "name":"Name 4",
                "photoUrl":"",
                "date" : "25.9. 2020",
                "bool": true
            },
        {
                "name":"Name 5",
                "photoUrl":"",
                "date" : "29.8. 2020",
                "bool": true
            },
        {
                "name":"Name 6",
                "photoUrl":"",
                "date" : "4.7. 2020",
                "bool": true
            },
        {
                "name":"Name 7",
                "photoUrl":"",
                "date" : "25.6. 2020",
                "bool": true
            },
        {
                "name":"Name 8",
                "photoUrl":"",
                "date" : "22.2. 2021",
                "bool": true
            },
        ];
        


function customSort(ls){
         
         var lsWithDatesAsBool = ls.filter((obj)=>{ return (typeof(obj.date)=="boolean") });
         var lsWithDatesAsNotBool = ls.filter((obj)=>{ return !(typeof(obj.date)=="boolean") });
         lsWithDatesAsNotBool.sort((a, b) => (convertToProperDate(a.date) < convertToProperDate(b.date)) ? 1 : -1)
         return lsWithDatesAsNotBool.concat(lsWithDatesAsBool);
        
        }
        
 function convertToProperDate(d)
        {
        var arr = d.split(".");
        var day = arr[0].trim();
        var month=arr[1].trim();
        var year = arr[2].trim();
        console.log(year+"-"+(month.length==1?("0"+month):month)+"-"+(day.length==1?("0"+day):day))
        return new Date(year+"-"+(month.length==1?("0"+month):month)+"-"+(day.length==1?("0"+day):day))
        }
    
console.log(customSort(ls));

我也是新手,这很有效,也许这不是最佳做法。

const data = [
  {
    name: "Name 1",
    photoUrl: "URL",
    date: false,
    bool: false,
  },
  {
    name: "Name2",
    photoUrl: "URL",
    date: false,
    bool: false,
  },
  {
    name: "Name 3",
    photoUrl: "URL",
    date: "1.6. 2020",
    bool: true,
  },
  {
    name: "Name 4",
    photoUrl: "",
    date: "25.9. 2020",
    bool: true,
  },
];

const sortingData = () => {
  let sortedData = [];

  //Getting data with date and adding them to the empty array.
  for (let i = 0; i < data.length; i++) {
    if (data[i].date) {
      sortedData.push(data[i]);
    }
  }
  //Sorting from new to old.
  sortedData.sort((a, b) => (a.date < b.date ? 1 : -1));

  //Getting data with no date and adding them to the new array.
  for (let i = 0; i < data.length; i++) {
    if (data[i].date === false) {
      sortedData.push(data[i]);
    }
  }
  return sortedData;
};