Lodash uniqBy 创建日期?

Lodash uniqBy created date?

嗨,我有这样的数据集

  1. ID:1,创建日期:7 月 7 日
  2. ID:1,创建日期:7 月 5 日
  3. ID:2,创建日期:7 月 7 日
  4. ID:2,创建日期:5-7 月

我想获取唯一值(按 ID),但选择最新版本(按日期)。 在上面的示例中,应返回第 1 项和第 3 项。

关于最干净的方法有什么建议吗?

谢谢!

您可以使用 Array.reduce 创建输入对象的映射,键入 ID

我们需要创建一个函数来解析 createDate 值,因为我们无法将其作为字符串进行比较。

如果 ID 处的映射条目为空,或者具有更早的创建日期,我们将在每次迭代时替换它:

const input = [
    { ID: 1, createDate: '7-Jul' },
    { ID: 1, createDate: '5-Jul' },
    { ID: 2, createDate: '7-Jul' },
    { ID: 2, createDate: '5-Jul' },
    { ID: 3, createDate: '1-Jan' },
    { ID: 3, createDate: '31-Dec' }
]

// Assuming date is like 5-Jul
function parseDate(dateString) {
    const [day,month] = dateString.toLowerCase().split('-');
    const months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
    const monthIndex = months.findIndex(mth => mth === month);
    return new Date(new Date().getFullYear(), monthIndex, day);
}

const result = Object.values(input.reduce((acc, cur) => { 
    // Replace the entry at ID _if_ empty or the new item is later
    if (!acc[cur.ID] || (parseDate(cur.createDate) > parseDate(acc[cur.ID].createDate))) {
       acc[cur.ID] = cur;  
    }
    return acc;
}, {}))

console.log("Result:", result)