【问题标题】:Sorting JSON object array by date or boolean in JavaScript在 JavaScript 中按日期或布尔值对 JSON 对象数组进行排序
【发布时间】:2021-07-01 03:52:20
【问题描述】:

我是 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
    },
]

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

非常感谢您的帮助。

【问题讨论】:

    标签: javascript json date sorting boolean


    【解决方案1】:
    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));
    

    【讨论】:

    • 它可以工作,但是如果我添加更多数据(我用更多数据更新了问题)它不能正常工作,那是我的错,我认为更少的数据足以让它工作。
    • @krystof18 ,这是因为您的日期格式不正确,所以排序不准确。现已更新解决方案,希望对您有所帮助!!
    • (obj)=&gt;{ return (typeof(obj.date)=="boolean") }中的所有括号和大括号都是多余的,使用obj =&gt; typeof obj.date == 'boolean'
    • 在日期解析器中,将一个字符串解析为另一个字符串,然后由内置解析器将其解析为 UTC 是没有意义的。考虑let [d, m, y] = d.split(/\D+/); return new Date(y, m-1, d) 以完全避免内置解析器。 \D+ 拆分一个或多个非数字字符以处理“25.6. 2020”等情况。
    【解决方案2】:

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

    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;
    };
    

    【讨论】:

    • 它可以工作,但是如果我添加更多数据(我用更多数据更新了问题)它不能正常工作,那是我的错,我认为更少的数据足以让它工作。
    • 不,它不起作用,因为 d.m.y 格式的日期不按词法排序。像 yyyy-mm-dd 这样的格式。此外,当a.date == b.date 时,排序函数应该返回 0,而你的函数返回 1,所以也可以是 (a, b) =&gt; a.date &lt; b.date
    猜你喜欢
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多