在JavaScript中按日期或布尔值对JSON对象数组排序
我是JavaScript新手,我有一个带有一些属性的JSON对象数组。我想按date属性对其排序,它可以是date或bool。我想举个例子可以帮助你理解我的问题在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
[
{
"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
。