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



我是JavaScript的新手,我有一个带有一些属性的JSON对象数组。我想按日期属性对它进行排序,日期属性可以是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 = [
{
"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;
};

最新更新