Javascript 根据日期对对象数组进行排序
从上面的对象数组中,我需要根据日期对它们进行排序,并获得如下输出Javascript 根据日期对对象数组进行排序,javascript,arrays,sorting,date,Javascript,Arrays,Sorting,Date,从上面的对象数组中,我需要根据日期对它们进行排序,并获得如下输出 [ 0: {date: "02-04-2020", count: 1} 1: {date: "16-04-2020", count: 2} 2: {date: "10-04-2020", count: 1} 3: {date: "15-04-2020", count: 4} 4: {date: "04-04-2020", count: 4} ] 我试着用下面的方法 [ 0: {date: "02-04-2020"
[
0: {date: "02-04-2020", count: 1}
1: {date: "16-04-2020", count: 2}
2: {date: "10-04-2020", count: 1}
3: {date: "15-04-2020", count: 4}
4: {date: "04-04-2020", count: 4}
]
我试着用下面的方法
[
0: {date: "02-04-2020", count: 1}
1: {date: "04-04-2020", count: 4}
2: {date: "10-04-2020", count: 1}
3: {date: "15-04-2020", count: 4}
4: {date: "16-04-2020", count: 2}
]
我在排序之前使用了.slice,因为我得到的错误是无法分配给对象“[object Array]的只读属性“0”,所以我引用并添加了slice
但是排序不正确,我需要一些帮助来解决这个问题。谢谢。您可能会遇到新日期的问题。。。不处理此格式的字符串,因为它不是标准格式。新日期02-04-2020将其解释为2020年2月4日,新日期16-04-2020将产生错误。这里似乎使用的是美国的日期格式,我们向后使用的是前一个月的日期 如果您的日期格式为yyyy mm dd,则新日期。。。这会正常工作,所以如果你能改变这一点,这将是最顺利的路线。如果你不能改变格式,你会想考虑改变排序:
const sorted_array = data
.slice()
.sort(
(a, b) => new Date(a.date).valueOf() - new Date(b.date).valueOf()
);
如果不想删除排序列,可以跳过最后一步
更新
如果您需要保留对象原型,那么正确地指出,扩展语法破坏了这一点。我实际上更喜欢的另一种方法是将排序列存储在单独的映射中。它被存储的原因是为了避免需要多次计算排序键
const sorted_array = data
.map(addSortableColumn)
.sort(bySortColumn)
.map(removeSortableColumn);
function addSortableColumn(item) {
const [day, month, year] = item.date.split('-');
return { ...item, _sortBy: year + month + day };
}
function bySortColumn(a, b) {
return a._sortBy.localeCompare(b._sortBy);
}
function removeSortableColumn(item) {
const { _sortBy, ...otherProps } = item;
return otherProps;
}
您可能会遇到新日期的问题。。。不处理此格式的字符串,因为它不是标准格式。新日期02-04-2020将其解释为2020年2月4日,新日期16-04-2020将产生错误。这里似乎使用的是美国的日期格式,我们向后使用的是前一个月的日期 如果您的日期格式为yyyy mm dd,则新日期。。。这会正常工作,所以如果你能改变这一点,这将是最顺利的路线。如果你不能改变格式,你会想考虑改变排序:
const sorted_array = data
.slice()
.sort(
(a, b) => new Date(a.date).valueOf() - new Date(b.date).valueOf()
);
如果不想删除排序列,可以跳过最后一步
更新
如果您需要保留对象原型,那么正确地指出,扩展语法破坏了这一点。我实际上更喜欢的另一种方法是将排序列存储在单独的映射中。它被存储的原因是为了避免需要多次计算排序键
const sorted_array = data
.map(addSortableColumn)
.sort(bySortColumn)
.map(removeSortableColumn);
function addSortableColumn(item) {
const [day, month, year] = item.date.split('-');
return { ...item, _sortBy: year + month + day };
}
function bySortColumn(a, b) {
return a._sortBy.localeCompare(b._sortBy);
}
function removeSortableColumn(item) {
const { _sortBy, ...otherProps } = item;
return otherProps;
}
您的日期格式不正确。 DD-MM-YYYY不是有效的日期格式
const sortKeys = new Map();
const sorted_array = data.slice().sort(byDDMMYYYY);
function byDDMMYYYY(a, b) {
return getSortKey(a).localeCompare(getSortKey(b));
}
function getSortKey(item) {
let key = sortKeys.get(item);
if (!key) {
const [day, month, year] = item.date.split('-');
key = year + month + day;
sortKeys.set(item, key);
}
return key;
}
将返回无效日期
您需要将日期转换为ISO日期格式YYYY-MM-DD
常量数据=[
{id:02-04-2020,计数:1},
{id:16-04-2020,计数:2},
{id:10-04-2020,计数:1},
{id:15-04-2020,计数:4},
{id:04-04-2020,计数:4},
];
console.logOriginal数据:,数据;
//差不多吧。
const dataSorted=data.slice.sorta,b=>{
const[dayA,monthA,yearA]=a._id.split-;
常数[dayB,monthB,yearB]=b.\u id.split-;
返回新日期`${yearA}-${monthA}-${dayA}`
-新日期`${yearB}-${monthB}-${dayB}`
};
console.logData按日期排序:,数据排序 您的日期格式不正确。 DD-MM-YYYY不是有效的日期格式
const sortKeys = new Map();
const sorted_array = data.slice().sort(byDDMMYYYY);
function byDDMMYYYY(a, b) {
return getSortKey(a).localeCompare(getSortKey(b));
}
function getSortKey(item) {
let key = sortKeys.get(item);
if (!key) {
const [day, month, year] = item.date.split('-');
key = year + month + day;
sortKeys.set(item, key);
}
return key;
}
将返回无效日期
您需要将日期转换为ISO日期格式YYYY-MM-DD
常量数据=[
{id:02-04-2020,计数:1},
{id:16-04-2020,计数:2},
{id:10-04-2020,计数:1},
{id:15-04-2020,计数:4},
{id:04-04-2020,计数:4},
];
console.logOriginal数据:,数据;
//差不多吧。
const dataSorted=data.slice.sorta,b=>{
const[dayA,monthA,yearA]=a._id.split-;
常数[dayB,monthB,yearB]=b.\u id.split-;
返回新日期`${yearA}-${monthA}-${dayA}`
-新日期`${yearB}-${monthB}-${dayB}`
};
console.logData按日期排序:,数据排序 请参阅@Jacob的答案,以了解您错误的解释。下面是一个使用正则表达式将日期更改为正确格式的替代解决方案:
new Date("15-04-2020")
还请注意,您不需要比较日期中的valueOf,算术已经为Date重载,以允许对象的本机比较
编辑:将repl更改为YYYY-MM-DD的ISO 8601兼容格式。请参阅@Jacob的答案,以了解错误的解释。下面是一个使用正则表达式将日期更改为正确格式的替代解决方案:
new Date("15-04-2020")
还请注意,您不需要比较日期中的valueOf,算术已经为Date重载,以允许对象的本机比较
编辑:将repl更改为ISO 8601兼容格式的YYYY-MM-DD。为什么您的数组中有密钥?属性日期或_id?日期,sry I刚更改。为什么您的数组中有密钥?属性日期或_id?日期,sry I刚更改。我建议repl=$3-$2-$1;相反,由于这是官方支持的格式。特别是ISO 8601,而新的Datea.date.replacepattern、repl在本例中起作用,因此它的解析不正确,因为它将日期视为UTC。创建Dat
e是不必要的,将$3-$2-$1作为字符串进行比较就足够了,而且可能更有效-我建议repl=$3-$2-$1;相反,由于这是官方支持的格式。特别是ISO 8601,而新的Datea.date.replacepattern、repl在本例中起作用,因此它的解析不正确,因为它将日期视为UTC。没有必要创建日期,将$3-$2-$1作为字符串进行比较就足够了,而且可能更有效-太好了,非常感谢你的解释-太好了,非常感谢你的解释-