Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中按日期或布尔值对JSON对象数组排序_Javascript_Json_Date_Sorting_Boolean - Fatal编程技术网

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

在JavaScript中按日期或布尔值对JSON对象数组排序,javascript,json,date,sorting,boolean,Javascript,Json,Date,Sorting,Boolean,我是JavaScript新手,我有一个带有一些属性的JSON对象数组。我想按date属性对其排序,它可以是date或bool。我想举个例子可以帮助你理解我的问题 [ { "name":"Name 1", "photoUrl":"URL", "date" : false, "bool": false

我是JavaScript新手,我有一个带有一些属性的JSON对象数组。我想按date属性对其排序,它可以是date或bool。我想举个例子可以帮助你理解我的问题

[
    {
        "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
    },
]
我可以随意更改数据结构。 基本上,我希望数组顶部的日期不为false,并按日期排序(最新的在顶部),然后按照日期为false的排序,但我找不到方法

非常感谢您的帮助。

var ls=[
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));
{ “名称”:“名称1”, “photoUrl”:“URL”, “日期”:假, “bool”:假 }, { “名称”:“名称2”, “photoUrl”:“URL”, “日期”:假, “bool”:假 }, { “名称”:“名称3”, “photoUrl”:“URL”, “日期”:“2020年6月1日”, “bool”:真的吗 }, { “名称”:“名称4”, “photoUrl”:“, “日期”:“2020年9月25日”, “bool”:真的吗 }, { “名称”:“名称5”, “photoUrl”:“, “日期”:“2020年8月29日”, “bool”:真的吗 }, { “名称”:“名称6”, “photoUrl”:“, “日期”:“2020年7月4日”, “bool”:真的吗 }, { “名称”:“名称7”, “photoUrl”:“, “日期”:“2020年6月25日”, “bool”:真的吗 }, { “名称”:“名称8”, “photoUrl”:“, “日期”:“2021年2月22日”, “bool”:真的吗 }, ]; 函数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)=>(convertTopropertDate(a.date)
我也是新来的,这很有效,也许这不是最好的做法

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;
};
const数据=[
{
名称:“名称1”,
photoUrl:“URL”,
日期:假,
布尔:错,
},
{
名称:“名称2”,
photoUrl:“URL”,
日期:假,
布尔:错,
},
{
姓名:“姓名3”,
photoUrl:“URL”,
日期:“2020年6月1日”,
布尔:是的,
},
{
名称:“名称4”,
photoUrl:“”,
日期:“2020年9月25日”,
布尔:是的,
},
];
常量排序数据=()=>{
设排序数据=[];
//获取带有日期的数据并将其添加到空数组。
for(设i=0;i(a.date
它可以工作,但如果我添加了更多数据(我用更多数据更新了问题),它就不能正常工作,这是我的错,我认为数据越少越好。@krystof18,这是因为您的日期格式不正确,所以排序不准确。现在已经更新了解决方案,希望有帮助!!
(obj)=>{return(typeof(obj.date)==“boolean”)}
中的所有括号和大括号都是多余的,请使用
obj=>typeof obj.date==“boolean”
。在日期解析器中,将字符串解析为另一个字符串,然后由内置解析器将其解析为UTC是没有意义的。考虑<代码>让[d,m,y]=d分裂(/\d+/);返回新日期(y,m-1,d)以完全避免内置解析器。
\D+
在一个或多个非数字字符上拆分,以处理诸如“25.6.2020”之类的情况。它可以工作,但如果我添加更多数据(我用更多数据更新了问题),它就不能正常工作,这是我的错,我认为数据越少越好,它就可以工作。不,它不能“工作”,因为D.m.y格式的日期不能按词汇排序。像yyyy-mm-dd这样的格式。此外,当函数返回1时,排序函数应该返回0,因此也可以是
(a,b)=>a.date