[英]Filter/Reduce array of objects into a new object based on day
考慮以下對象數組:
const data = [
*{...more data from previous dates}*,
{
unixDate: 1650348034, //yesterday
dateTime: Tue Apr 19 2022 23:00:34,
severityLevel: 1,
severity: "Light"
},
{
unixDate: 1650348034, //yesterday
dateTime: Tue Apr 19 2022 14:00:34,
severityLevel: 3,
severity: "Moderate"
},
{
unixDate: 1650440700, //today
dateTime: Wed Apr 20 2022 15:45:00,
severityLevel: 2,
severity: "Moderate-Light"
},
{
unixDate: 1650442500, //today
dateTime: Wed Apr 20 2022 15:45:00,
severityLevel: 4,
severity: "Heavy"
},
{
unixDate: 1650427234, //today
dateTime: Wed Apr 20 2022 12:00:00,
severityLevel: 3,
severity: "Moderate"
}
]
我想返回以下內容:
{
*///...records from previous dates,*
1650348034 : 2, //yesterday record taking only one of the unixtimestamp, and the average value of 'severityLevel'.
1650440700 : 3 //same as above but unixtimestamp is today.
}
我正在使用dayjs
package 來確定日期是否是今天,通過isToday
插件,但想不出如何比較日期。 data
每天都在增長,因為它記錄了新的讀數。 我不太熟悉 ES6 中的數組過濾/歸約方法,它們在這里有用嗎? 任何幫助表示贊賞!
首先,您需要將那些 unix 次轉換為 javascript 次Date
對象。 然后您可以按年/月/日分組,然后對結果進行平均。
const data = [ { unixDate: 1650348034, //yesterday dateTime: "Tue Apr 19 2022 23:00:34", severityLevel: 1, severity: "Light" }, { unixDate: 1650348034, //yesterday dateTime: "Tue Apr 19 2022 14:00:34", severityLevel: 3, severity: "Moderate" }, { unixDate: 1650440700, //today dateTime: "Wed Apr 20 2022 15:45:00", severityLevel: 2, severity: "Moderate-Light" }, { unixDate: 1650442500, //today dateTime: "Wed Apr 20 2022 15:45:00", severityLevel: 4, severity: "Heavy" }, { unixDate: 1650427234, //today dateTime: "Wed Apr 20 2022 12:00:00", severityLevel: 3, severity: "Moderate" } ] const x = Object.values(data.map(x => ({...x, dateTime: new Date(x.unixDate * 1000)})).reduce( (acc,i) => { const key = "" + i.dateTime.getFullYear() + i.dateTime.getMonth() + i.dateTime.getDate(); acc[key] = acc[key] || []; acc[key].push(i); return acc },{})).reduce( (obj,rec) => { return {...obj, [rec[0].unixDate]: rec.reduce( (acc,i) => acc+i.severityLevel,0) / rec.length } },{}) console.log(x)
Nothe 如果屬性dateTime
已經是 javascript 日期,則可以不使用data.map(x => ({...x, dateTime: new Date(x.unixDate * 1000)}))
部分。
獲取唯一的天數列表,並根據計算出的天數構建一個 object
const data = [ { unixDate: 1650348034, dateTime: "Tue Apr 19 2022 23:00:34", severityLevel: 1, severity: "Light" }, { unixDate: 1650348034, dateTime: "Tue Apr 19 2022 14:00:34", severityLevel: 3, severity: "Moderate" }, { unixDate: 1650440700, dateTime: "Wed Apr 20 2022 15:45:00", severityLevel: 2, severity: "Moderate-Light" }, { unixDate: 1650442500, dateTime: "Wed Apr 20 2022 15:45:00", severityLevel: 4, severity: "Heavy" }, { unixDate: 1650427234, dateTime: "Wed Apr 20 2022 12:00:00", severityLevel: 3, severity: "Moderate" } ] //Get unique list of days let unique = [... new Set(data.map(d => new Date(d.unixDate * 1000).toLocaleDateString("en-US")))]; //build object based on this list let results = Object.fromEntries(unique.map(m => { let records = data.filter(v => new Date(v.unixDate * 1000).toLocaleDateString("en-US") === m); return [records[0].unixDate, records.reduce((v,o) => v+=o.severityLevel, 0) / records.length ] })); console.log(results);
您正在尋找的方法是 Array.map(),它很容易使用,您在數組上調用它並提供一個 function 它將返回每個索引的新數據,而原始數據是在 function 時提供的自己。
要執行您想執行的操作,您還必須使用 Object.fromEntries() 將數組轉換為 object。以下是操作方法:
let newData = Object.fromEntries(data.map((d)=>[d.unixDate, d.severityLevel]));
此代碼將首先將您的數據轉換為包含 arrays 的數組,其中 0 索引是鍵也就是時間戳,1 索引是該鍵的數據也就是您的嚴重級別。 它看起來像這樣:
[
[1650348034,1],
[1650348034,3],
[1650440700,2],
[1650442500,4],
[1650427234,3]
]
然后它被轉換為你的 object
在這里查看更多信息:
希望這可以幫助
另一種使用 util 方法dayBegins
的方法將計算日期開始時間戳。 這將有助於確定時間戳是否屬於同一天。
除此之外,只需構建一個跟蹤 object,鍵為 dayBegin,值為 severityLevel 和 number occurrences。
const dayBegins = (uDate) => "" + uDate * 1000 - ((uDate * 1000) % (24 * 60 * 60 * 1000)); const process = (arr, output = {}) => { arr.forEach(({ unixDate, severityLevel }) => { const key = dayBegins(unixDate); if (key in output) { output[key].count += 1; output[key].sum += severityLevel; } else { output[key] = { unixDate, count: 1, sum: severityLevel, }; } }); return Object.values(output).reduce( (acc, { unixDate, sum, count }) => Object.assign(acc, { [unixDate]: sum / count }), {} ); }; const data = [ { unixDate: 1650348034, //yesterday dateTime: "Tue Apr 19 2022 23:00:34", severityLevel: 1, severity: "Light", }, { unixDate: 1650348034, //yesterday dateTime: "Tue Apr 19 2022 14:00:34", severityLevel: 3, severity: "Moderate", }, { unixDate: 1650440700, //today dateTime: "Wed Apr 20 2022 15:45:00", severityLevel: 2, severity: "Moderate-Light", }, { unixDate: 1650442500, //today dateTime: "Wed Apr 20 2022 15:45:00", severityLevel: 4, severity: "Heavy", }, { unixDate: 1650427234, //today dateTime: "Wed Apr 20 2022 12:00:00", severityLevel: 3, severity: "Moderate", }, ]; console.log(process(data))
好吧,我希望我理解正確。 這是您如何實現類似於您想要的 output 的示例:
//input const data = [ { "unixDate": 1650348034, //yesterday "dateTime": "Tue Apr 19 2022 23:00:34", "severityLevel": 1, "severity": "Light" }, { unixDate: 1650348034, //yesterday dateTime: "Tue Apr 19 2022 14:00:34", severityLevel: 3, severity: "Moderate" }, { unixDate: 1650440700, //today dateTime: "Wed Apr 20 2022 15:45:00", severityLevel: 2, severity: "Moderate-Light" }, { unixDate: 1650442500, //today dateTime: "Wed Apr 20 2022 15:45:00", severityLevel: 4, severity: "Heavy" }, { unixDate: 1650427234, //today dateTime: "Wed Apr 20 2022 12:00:00", severityLevel: 3, severity: "Moderate" } ]; // ES6 computed property syntax const arr = data.map(x => { return { [x.unixDate]: x.severityLevel }}); //output console.log(arr.reduce(function(result, current) { return Object.assign(result, current); }, {}));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.