代码之家  ›  专栏  ›  技术社区  ›  Qiuzman

减少后对对象的属性进行排序

  •  -1
  • Qiuzman  · 技术社区  · 1 年前

    我正在通过按outlook电子邮件的对话id对其列表进行分组来重新创建outlook邮箱的效果。但是,我需要对列表进行两次排序,以便每组中的电子邮件从最新电子邮件到最旧电子邮件排序,而且对话列表本身也需要从最旧到最新排序。由于对话是数组,因此需要使用数组中的第一个项(排序后应该是该数组中最新的项)来进行此数组比较。

    分组后的对象如下所示:

    {"sdfjskldfjks" : [{from: "joe", received_date:"07/11/1990 5:30PM"}], "dfjsakldfjhsa" : [{from: "john", received_date:"07/12/1990 5:30PM"},{from: "jake", received_date:"07/12/1989 5:30PM"}]}
    

    我用来进行此分组的函数如下:

      const cleanFolder = computed(() => {
        if(currentFolder.value == null){
          return []
        }
      
        function groupBy(arr: any[], property: string) {
            return arr.reduce(function (memo: { [x: string]: any[]; }, x: { [x: string]: string | number; }) {
                if (!memo[x[property]]) { memo[x[property]] = []; }
                memo[x[property]].push(x);
                return memo;
            }, {});
        };
    
        return groupBy(currentFolder.value.emails,'conversation_id')
      })
    

    我知道如何对数组进行排序,但我需要根据所示的对象进行排序,所以我一无所知!

    1 回复  |  直到 1 年前
        1
  •  0
  •   SELA    1 年前

    首先,您需要将电子邮件分组为 conversation_id 然后 Sort 每个对话组依据 received_date 。之后,您需要根据 接收日期 每组中最新电子邮件的。请参阅中的顺序 cleanFolder() .

    有关更多参考信息,请参阅以下代码:

    const emails = [
        { from: 'joe', received_date: '07/11/1990 5:30PM', conversation_id: 'sdfjskldfjks' },
        { from: 'john', received_date: '07/12/1990 5:30PM', conversation_id: 'dfjsakldfjhsa' },
        { from: 'jake', received_date: '07/12/1989 5:30PM', conversation_id: 'dfjsakldfjhsa' }
    ];
    
    function groupBy(arr, property) {
        return arr.reduce(function (memo, email) {
            if (!memo[email[property]]) { 
                memo[email[property]] = []; 
            }
            memo[email[property]].push(email);
            return memo;
        }, {});
    }
    
    function sortEmailsByDateDescending(emails) {
        return emails.sort((a, b) => new Date(b.received_date) - new Date(a.received_date));
    }
    
    function sortConversationGroupsByNewestEmailDate(conversationGroups) {
        return conversationGroups.sort((groupA, groupB) => {
            const newestA = new Date(groupA[0].received_date);
            const newestB = new Date(groupB[0].received_date);
            return newestA - newestB;
        });
    }
    
    function cleanFolder() {
        if (emails.length === 0) {
            return [];
        }
        const groupedEmails = groupBy(emails, 'conversation_id'); // group from conversation_id
        let conversationGroups = Object.values(groupedEmails);
        conversationGroups = conversationGroups.map(sortEmailsByDateDescending);
        conversationGroups = sortConversationGroupsByNewestEmailDate(conversationGroups);
    
        return conversationGroups;
    }
    
    console.log(JSON.stringify(cleanFolder()));