根据javascript中的日期字段删除重复元素

时间:2018-03-24 02:01:23

标签: javascript ecmascript-6

我想要一个带有数组并过滤掉旧副本的函数。

具体来说,如果myList中存在重复的ID,则只保留具有最新日期的对象。给出以下数组

let myList = [{
    id: "e9519e95-5a10-4274-ac24-de72ad60ffd7",
    date: "2018-02-21 21:04:13"
},
{
    id: "026e7ecf-d236-4aff-b26d-7546ac85b7d5",
    date: "2018-02-22 21:04:13"
},
{
    id: "e9519e95-5a10-4274-ac24-de72ad60ffd7",
    date: "2018-02-23 21:04:13"
}]

该函数应返回:

[{
    id: "026e7ecf-d236-4aff-b26d-7546ac85b7d5",
    date: "2018-02-22 21:04:13"
},
{
    id: "e9519e95-5a10-4274-ac24-de72ad60ffd7",
    date: "2018-02-23 21:04:13"
}]

4 个答案:

答案 0 :(得分:2)

您可以使用函数reduce来构建所需的输出。

let myList = [{    id: "e9519e95-5a10-4274-ac24-de72ad60ffd7",    date: "2018-02-21 21:04:13"},{    id: "026e7ecf-d236-4aff-b26d-7546ac85b7d5",    date: "2018-02-22 21:04:13"},{    id: "e9519e95-5a10-4274-ac24-de72ad60ffd7",    date: "2018-02-23 21:04:13"}];

let result = Object.values(myList.reduce((a, {id, date}) => {
  if (a[id]) {
    if (a[id].date < date) a[id] = {id, date};
  } else a[id] = {id, date};
  
  return a;
}, {}));

console.log(result);

答案 1 :(得分:1)

将条目放入由id键入的哈希表中。每次添加条目时,请查找ID并保留现有条目或将其替换为新条目,具体取决于具有较新日期的条件。

答案 2 :(得分:0)

MapArray.prototype.map()可以组合在一起,以key的形式从功能上过滤基于arrays的重复项。

可以利用

Array.prototype.sort()来保证订单。

请参阅下面的实例。

// Input.
const input = [
  {id: "e9519e95-5a10-4274-ac24-de72ad60ffd7", date: "2018-02-21 21:04:13"}, 
  {id: "026e7ecf-d236-4aff-b26d-7546ac85b7d5", date: "2018-02-22 21:04:13"}, 
  {id: "e9519e95-5a10-4274-ac24-de72ad60ffd7", date: "2018-02-23 21:04:13"}
]

// Sort By Date.
const sortDate = array => array.sort((A, B) => new Date(A.date)*1 - new Date(B.date)*1)

// Filter Duplicates.
const filter = array => [...new Map(array.map(x => [x.id, x])).values()]

// Output.
const outputRaw = filter(input) // No guaranteed order.
const outputSorted = sortDate(filter(sortDate(input))) // Guaranteed latest.

// Proof.
console.log('Raw', outputRaw)
console.log('Sorted', outputSorted)

答案 3 :(得分:0)

这不是最好的答案,只是对@Ele's solution提供完整性的另一种看法。在找到唯一集合之后,它不是在读取值,而是在每次迭代的返回数组上工作。每次迭代期间的find应该比密钥查找效率低,这是它不是最佳答案的原因之一。

let myList = [{
  id: "e9519e95-5a10-4274-ac24-de72ad60ffd7",
  date: "2018-02-21 21:04:13"
}, {
  id: "026e7ecf-d236-4aff-b26d-7546ac85b7d5",
  date: "2018-02-22 21:04:13"
}, {
  id: "e9519e95-5a10-4274-ac24-de72ad60ffd7",
  date: "2018-02-23 21:04:13"
}]

let result = myList.reduce((arr, { id, date }) => {
  let found = arr.find(v=>v.id==id)
  if (found) {
    if (found.date < date) 
      found.date = date
  } 
  else 
    arr.push({ id, date });

  return arr;
}, []);

console.log(result);