簡體   English   中英

根據日期將對象數組過濾/減少為新的 object

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM