簡體   English   中英

如何在JavaScript中獲得每小時的最新心情

[英]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"
  }
];

JsFiddle在這里

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.jslodash ,但是為了提高性能,您應該真正考慮采用另一種方式,例如通過數據庫查詢。

 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.

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