Javascript 如何根据最大值和最小值按时间戳的顺序创建对象数组?
试图找到创建一个对象数组的最佳方法,在该数组中,我一天只获取两次最大值和最小值(中午12:00pm之前和中午12:00pm之后)。结果仍应按时间顺序返回 我知道最好的方法是:Javascript 如何根据最大值和最小值按时间戳的顺序创建对象数组?,javascript,arrays,date,object,timestamp,Javascript,Arrays,Date,Object,Timestamp,试图找到创建一个对象数组的最佳方法,在该数组中,我一天只获取两次最大值和最小值(中午12:00pm之前和中午12:00pm之后)。结果仍应按时间顺序返回 我知道最好的方法是: 首先根据日期过滤数据(我使用的是moment.js) 然后将一天过滤成两个不同的数组:中午之前[],下午[] 然后使用reduce获得数组的最大值 然后使用reduce获得数组的最小值 将结果合并到1个数组中,并按时间升序排序 我希望有一个更简单的方法来做到这一点。。。如果你有任何建议,请告诉我。提前感谢您的建议 con
const数据=[
{“t”:“2020-05-2703:42”,“v”:“2.151”},
{“t”:“2020-05-27 08:48”,“v”:“3.125”},
{“t”:“2020-05-27 11:54”,“v”:“4.106”},
{“t”:“2020-05-27 18:00”,“v”:“5.094”},
{“t”:“2020-05-27 21:06”,“v”:“4.088”},
{“t”:“2020-05-27 23:12”,“v”:“3.090”},
{“t”:“2020-05-28 00:18”,“v”:“2.098”},
{“t”:“2020-05-2803:24”,“v”:“1.114”},
{“t”:“2020-05-28 08:30”,“v”:“2.136”},
{“t”:“2020-05-2812:36”,“v”:“3.166”},
{“t”:“2020-05-2817:42”,“v”:“4.202”},
{“t”:“2020-05-2822:48”,“v”:“5.245”},
];
//步骤1:
//过滤数据以仅返回特定日期“2020-05-27”
const today=data.filter(d=>moment(d.t).format('YYYY-MM-DD')==='2020-05-27');
log('TODAY='+JSON.stringify(TODAY));
//步骤2:
//将今天的数据分成一半
const todaybeaforeoon=today.filter(d=>moment(d.t).format('HH')moment(d.t.).format('HH')>11');
log('TODAY beforeon='+JSON.stringify(TODAY beforeon));
log('todayAfterNoon='+JSON.stringify(todayAfterNoon));
//步骤3:
//获取每半天的最大值
const beforenomax=今天beforenomax.reduce((a,b)=>{return(a.v>b.v)?a:b},0);
const午后max=todayAfterNoon.reduce((a,b)=>{return(a.v>b.v)?a:b},0);
log('MAX beforennoon='+JSON.stringify(beforennoonmax));
log('MAX AFTER NOON='+JSON.stringify(afterNoonMax));
//步骤4:
//获取每半天的最小值
const beforeNoonMin=today beforenoon.reduce((a,b)=>{return(a.v{return(a.v
以下是一种使用散列来组织数据的方法。哈希键是:
"yyyy-mm-dd-AM" or "yyyy-mm-dd-PM"
它将数据对象放入易于处理的子数组中
const数据=[
{t:“2020-05-27 03:42”,v:“2.151”},
{t:“2020-05-27 08:48”,v:“3.125”},
{t:“2020-05-27 11:54”,v:“4.106”},
{t:“2020-05-27 18:00”,v:“5.094”},
{t:“2020-05-27 21:06”,v:“4.088”},
{t:“2020-05-27 23:12”,v:“3.090”},
{t:“2020-05-28 00:18”,v:“2.098”},
{t:“2020-05-2803:24”,v:“1.114”},
{t:“2020-05-28 08:30”,v:“2.136”},
{t:“2020-05-2812:36”,v:“3.166”},
{t:“2020-05-2817:42”,v:“4.202”},
{t:“2020-05-2822:48”,v:“5.245”},
];
//创建具有属性的哈希对象
//“yyyy-mm-dd-AM”:[
//{“t”:“yyyy-mm-dd-AM hh:mm”,“v”:“1.234”},
// ...
// ],
//“yyyy-mm-dd-PM”:[],
// ...
设hash={};
data.forEach((电视)=>{
让[日期,时间]=tv.t.split(“”);
让[hour,minute]=time.split(“:”);
让子午线=小时>=12?”-PM:“-AM”;
让propName=日期+子午线;
散列[propName]=散列[propName]| |[];
哈希[propName]。推送(电视);
});
//log(“hash:,JSON.stringify(hash,null,2));
设minmaxArray=[];
//迭代每个哈希属性
Object.values(hash.forEach)((hashProp)=>{
//确定hashProp数组中的最小值和最大值
设vals=hashProp.map((tv)=>tv.v);
设vMin=Math.min(…VAL);
设vMax=Math.max(…VAL);
//将最小和最大数据元素推送到阵列上
让tvMin=hashProp.filter((tv)=>tv.v==vMin)[0];
让tvMax=hashProp.filter((tv)=>tv.v==vMax)[0];
minmaxArray.push(tvMin);
minmaxArray.push(tvMax);
});
//按日期和时间排序
排序((a,b)=>a.t.localeCompare(b.t));
const results=document.getElementById('results');
results.innerHTML=“minmaxArray:”+
stringify(minmaxArray,null,2)代码>
结果:
类似ISO 8601格式的优点之一是字符串和数字方法可以直接应用于排序、分组和比较,例如
let数据=[
{“t”:“2020-05-2703:42”,“v”:“2.151”},
{“t”:“2020-05-27 08:48”,“v”:“3.125”},
{“t”:“2020-05-27 11:54”,“v”:“4.106”},
{“t”:“2020-05-27 18:00”,“v”:“5.094”},
{“t”:“2020-05-27 21:06”,“v”:“4.088”},
{“t”:“2020-05-27 23:12”,“v”:“3.090”},
{“t”:“2020-05-28 00:18”,“v”:“2.098”},
{“t”:“2020-05-2803:24”,“v”:“1.114”},
{“t”:“2020-05-28 08:30”,“v”:“2.136”},
{“t”:“2020-05-2812:36”,“v”:“3.166”},
{“t”:“2020-05-2817:42”,“v”:“4.202”},
{“t”:“2020-05-2822:48”,“v”:“5.245”},
];
让结果=Object.values(
//排序,不是真的需要,只是为了确保
data.sort((a,b)=>a.t.localeCompare(b.t))
//按日期和上午/下午分组
.减少((acc,el)=>{
设[d,t]=el.t.split(“”);
设dayPeriod=parseInt(t)<12?'am':'pm';
设key=d+'\'+dayperion;
acc[键]?acc[键]。按下(el):acc[键]=[el];
返回acc;
}, {})
)
//仅获取am和pm的最大值和最小值
.减少((acc,el)=>{
//根据温度对dayPeriod组进行排序
el.sort((a,b)=>a.v-b.v);
//最小值将是第一位,最大值将是最后一位
加速推力(el[0],el[el.长度-1]);
返回acc;
}, []);
console.log(结果)