我有一个对象数组 -
[
{ name:'abc',
lRange: '2020-01-01',
hRange: '2020-01-22',
},
{ name:'abc',
lRange: '2020-01-01',
hRange: '2020-01-22',
},
{ name:'def',
lRange: '2020-01-15',
hRange: '2020-01-30',
},
{ name:'ghi',
lRange: '2020-02-10',
hRange: '2020-02-22',
}
]
我需要获得最小日期和最大日期范围,结合所有日期 lRange 和 hRange 日期 - 日期也会重叠。
我试过按日期时间排序,但这并没有给我正确的范围。有什么想法吗?
答案 0 :(得分:1)
这是一种方法,尽管我怀疑还有更优雅的方法。它将每个字符串日期转换为日期对象并进行比较。最后,它取最小值和最大值并将它们转换回可读的字符串。
let dates = [{
name: 'abc',
lRange: '2019-02-01',
hRange: '2020-01-22',
},
{
name: 'abc',
lRange: '2020-01-01',
hRange: '2020-01-22',
},
{
name: 'def',
lRange: '2020-01-15',
hRange: '2020-01-30',
},
{
name: 'ghi',
lRange: '2020-02-10',
hRange: '2020-02-22',
}
]
let output = {}
dates.forEach(obj => {
if (!output.min) {
output.min = new Date(obj.lRange);
output.max = new Date(obj.hRange);
} else {
output.min = Math.min(output.min, new Date(obj.lRange))
output.max = Math.max(output.max, new Date(obj.hRange))
}
})
//convert back to date strings
output.min = new Date(output.min).toISOString().split("T")[0]
output.max = new Date(output.max).toISOString().split("T")[0]
console.log(output)
答案 1 :(得分:1)
您可以使用 flatMap 获取所有日期,然后对其进行排序。排序后第一个元素(即索引 0
处的元素)为 minRange,最后一个索引处的元素为 maxRange。
const arr = [
{ name: "abc", lRange: "2020-01-01", hRange: "2020-01-22" },
{ name: "abc", lRange: "2020-01-01", hRange: "2020-01-22" },
{ name: "def", lRange: "2020-01-15", hRange: "2020-01-30" },
{ name: "ghi", lRange: "2020-02-10", hRange: "2020-02-22" },
];
const sortedResult = arr
.flatMap((obj) => [obj.lRange, obj.hRange])
.sort((a, b) => new Date(a) - new Date(b));
const result = {
min: sortedResult[0],
max: sortedResult[sortedResult.length - 1],
};
console.log(result);
答案 2 :(得分:0)
如果方便的话,您可以将 lRagnes 和 hRanges 提取到单独的数组中。
var lDates = [];
var hDates = [];
yourArray.map((innerObjects) => {
lDates .push(innerObjects.lRange);
hDates .push(innerObjects.hRange);
});