归约后对对象的属性进行排序

问题描述 投票:0回答:1

我正在通过按对话 ID 对 Outlook 电子邮件列表进行分组来重新创建 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')
  })

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

javascript typescript vue.js sorting
1个回答
0
投票

首先,您需要按

conversation_id
对电子邮件进行分组。然后按
Sort
received_date
每个对话组。之后,您需要从每个组中最新电子邮件的
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()));

© www.soinside.com 2019 - 2024. All rights reserved.