有条件地删除重复元素

时间:2018-08-15 23:35:58

标签: javascript node.js ecmascript-6

我有一个看起来像这样的对象数组:

[
    { project: "test1", date: "8/14/2018" },
    { project: "test1", date: "8/15/2018" },
    { project: "test2", date: "8/14/2018" }
]

我要根据项目名称BUT删除重复的对象,并保留最新的对象。

所以我的最终数组是这样的:

[
    { project: "test1", date: "8/15/2018" },
    { project: "test2", date: "8/14/2018" }
]

我想出了一个令我不满意的递归解决方案。

正在寻找一种不费吹灰之力的建议。

2 个答案:

答案 0 :(得分:1)

我通常针对此类问题的方法是维护一个“字典”对象以在迭代过程中跟踪唯一性,然后从该结果中提取最终结果。 reduce是从多个值中创建一个值的首选工具:

const dict = objects.reduce((result, item) => {
  const currentForProject = result[item.project];
  const isMostRecent = 
      !currentForProject
      || new Date(item.date) > new Date(currentForProject.date);
  if (isMostRecent) {
    result[item.project] = item;
  }
  return result;
}, {});

const mostRecents = Object.values(dict);

答案 1 :(得分:0)

我将提出通用算法来解决您的任务,但具体实现取决于您。

  • 1)根据date字段对数组进行排序;
  • 2)创建一个空的Set用于存储项目名称,并为结果创建一个空数组;
  • 3)遍历排序后的数组并检查:
  • 3.1)如果Set不包含当前项目名称,则:
  • 3.2)将项目名称添加到Set并将当前项目添加到结果中 数组;