[英]How to get the most recent mood for each hour in javascript
如何過濾數組以獲取每小時的最新心情?
示例數據模型:
var arr = [{
mood: "normal",
date: "29-7-2018",
time: "9:24 am"
},
{
mood: "normal",
date: "29-7-2018",
time: "9:34 am"
},
{
mood: "normal",
date: "29-7-2018",
time: "9:40 am"
},
{
mood: "normal",
date: "29-7-2018",
time: "10:14 am"
},
{
mood: "normal",
date: "29-7-2018",
time: "10:46 am"
},
{
mood: "normal",
date: "29-7-2018",
time: "2:04 pm"
},
{
mood: "normal",
date: "29-7-2018",
time: "2:14 pm"
},
{
mood: "normal",
date: "29-7-2018",
time: "3:01 pm"
}
];
let l = arr.length;
/* console.log("length - " + l); */
let _time = formatAMPM(new Date()).split(":")[0];
arr = arr.filter(obj => obj.time.split(":")[0] != _time);
/* l = arr.length; */
/* for (i = l; i > 0; i--) {
arr = arr.filter(obj => obj.time.split(":")[0] == _time);
// console.log("--Fil elem--");
// console.log(arr);
} */
console.log(arr);
function formatAMPM(date) {
var hours = date.getHours();
var minutes = date.getMinutes();
var ampm = hours >= 12 ? "pm" : "am";
hours = hours % 12;
hours = hours ? hours : 12; // the hour '0' should be '12'
minutes = minutes < 10 ? "0" + minutes : minutes;
var strTime = hours + ":" + minutes + " " + ampm;
return strTime;
}
您可以先按小時將項目分組,例如:
let arr = [...Your array of objects...];
let groupedByHour = arr.reduce(function(result, item) {
let hour = item.time.split(':')[0];
result[hour] = result[hour] || [];
result[hour].push(item);
return result;
}, {});
這將給您這樣的對象:
{
2:[
{mood: "normal", date: "29-7-2018", time: "2:04 pm"},
{mood: "normal", date: "29-7-2018", time: "2:14 pm"}
],
3: [
{mood: "normal", date: "29-7-2018", time: "3:01 pm"}
]
// and so on...
}
現在您已將所有項目按小時分組,因此現在可以遍歷對象,並使用date字段按降序對數組進行排序,例如:
for(let key in groupedByHour) {
groupedByHour[key].sort(function(a, b) {
return a.time < b.time;
});
}
現在,您將獲得相同的對象,但數組是有序的,因此將如下所示:
{
2:[
{mood: "normal", date: "29-7-2018", time: "2:14 pm"},
{mood: "normal", date: "29-7-2018", time: "2:04 pm"}
],
3: [
{mood: "normal", date: "29-7-2018", time: "3:01 pm"}
]
// and so on...
}
現在,在每個小時中,數組的第一項是最新的心情,因此,如果您希望從每個小時中獲取所有最新的心情,則可以這樣獲取:
let moods = {};
for (let k in groupedByHour) {
moods[k] = groupedByHour[k][0];
}
// Log them out
console.log(moods);
在此處檢查console.log (每個鍵是一個小時,值是最新的心情)。
對於moment.js
和lodash
,但是為了提高性能,您應該真正考慮采用另一種方式,例如通過數據庫查詢。
var arr = [{mood: "normal",date: "29-7-2018",time: "9:24 am"},{mood: "normal",date: "29-7-2018",time: "9:34 am"},{mood: "normal",date: "29-7-2018",time: "9:40 am"},{mood: "normal",date: "29-7-2018",time: "10:14 am"},{mood: "normal",date: "29-7-2018",time: "10:46 am"},{mood: "normal",date: "29-7-2018",time: "2:04 pm"},{mood: "normal",date: "29-7-2018",time: "2:14 pm"},{mood: "normal",date: "29-7-2018",time: "3:01 pm"}]; let moods = arr.map(o=>({mood:o.mood,datetime:moment(o.date + " "+ o.time,'DD-MM-YYYY hh:mm A')})).sort((a,b)=>a.datetime.valueOf() < b.datetime.valueOf()) moods = _.uniqWith(moods,(a,o)=>moment(o.datetime).startOf('hour').valueOf()===moment(a.datetime).startOf('hour').valueOf()) console.log(moods)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
我通過將解決方案的骨架分解為功能,並使用清晰的名稱和注釋來破壞了它的框架。 這些還沒有完成,但是應該使您開始了解如何解決問題。
步驟如下:
var moods = [{ mood: "normal", date: "29-7-2018", time: "9:24 am" }, { mood: "normal", date: "29-7-2018", time: "9:34 am" }, { mood: "normal", date: "29-7-2018", time: "9:40 am" }, { mood: "normal", date: "29-7-2018", time: "10:14 am" }, { mood: "normal", date: "29-7-2018", time: "10:46 am" }, { mood: "normal", date: "29-7-2018", time: "2:04 pm" }, { mood: "normal", date: "29-7-2018", time: "2:14 pm" }, { mood: "normal", date: "29-7-2018", time: "3:01 pm" } ]; // takes time as a string and returns an hour as a string //not finished function getHour(timeAsString) { return "2"; } // creates an object of arrays for each hour, // one per hour // ["1":[{...},{....}], .... let groupMoodsByHour = (memo, current) => { const hour = getHour(current); if (memo[hour]) { memo[hour].push(current); } else { memo[hour] = [current] } return memo; }; // gets the most recent object from an array of moodObjects function getLatestHour(arrayOfMoods) { return arrayOfMoods[0]; } let moodsByHour = moods.reduce(groupMoodsByHour,[]).map(getLatestHour); console.log(moodsByHour);
這將無法正常工作,但應該是一個很好的開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.