如何根据条件获取唯一项

How to get the unique items based on condition

我有一个 Javascript 片段来仅存储对象数组中的唯一项,如下所示:-

const array = [
    {id: 3, name: 'Central Microscopy', fiscalYear: 2018},
    {id: 5, name: 'Crystallography Facility', fiscalYear: 2018},
    {id: 3, name: 'Central Microscopy', fiscalYear: 2017},
    {id: 5, name: 'Crystallography Facility', fiscalYear: 2017},
    {id: 3, name: 'Central Microscopy', fiscalYear: 2019},
  ];
  const result = [];
  const map = new Map();
  for (const item of array) {
    if (!map.has(item.id) ) {
      map.set(item.id, true); // set any value to Map
      result.push({
        id: item.id,
        name: item.name,
        fiscalYear: item.fiscalYear
      });
    }
  }
  console.log(result);

这个结果是

[
  { id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
  { id: 5, name: 'Crystallography Facility', fiscalYear: 2018 }
]

现在我想要拥有独特的项目,并且拥有那些会计年度大于现有项目的项目。 例如:- 对于相同的输入,输出应为:- 我需要 javascript 或打字稿(语言约束)

中的代码
[
  { id: 3, name: 'Central Microscopy', fiscalYear: 2019},
  { id: 5, name: 'Crystallography Facility', fiscalYear: 2018 }
]

即使数据很大也需要一个最优解

let array = [
    {id: 3, name: 'Central Microscopy', fiscalYear: 2018},
    {id: 5, name: 'Crystallography Facility', fiscalYear: 2018},
    {id: 3, name: 'Central Microscopy', fiscalYear: 2027},
    {id: 3, name: 'Central Microscopy', fiscalYear: 2017},
    {id: 5, name: 'Crystallography Facility', fiscalYear: 2017},
    {id: 3, name: 'Central Microscopy', fiscalYear: 2019},
    {id: 3, name: 'Central Microscopy', fiscalYear: 2021},
  ];
  
  let temp = array.filter((elem) => elem.fiscalYear >= 2018)
  let cache = {}

  temp.forEach((elem) => {
      if(cache[elem.name]){
          if(cache[elem.name].fiscalYear < elem.fiscalYear){
              cache[elem.name] = elem;
          }
      }
      else{
           cache[elem.name] = elem;
      }
  })

  let result = Object.values(cache);
  console.log(result);

你只需要在循环中再添加一个过滤器,

  let bigYear = item.fiscalYear

  let filteredItem = array.filter((e=>e.id===item.id && e.fiscalYear > bigYear))[0]

  result.push(filteredItem ? {...filteredItem} : item);

最终版 片段看起来很像,

const array = [
    {id: 3, name: 'Central Microscopy', fiscalYear: 2018},
    {id: 3, name: 'Central Microscopy', fiscalYear: 2029},
    {id: 3, name: 'Central Microscopy', fiscalYear: 2017},
    {id: 5, name: 'Crystallography Facility', fiscalYear: 2017},
    {id: 5, name: 'Crystallography Facility', fiscalYear: 2018},
  ];
  const result = [];
  const map = new Map();
  for (const item of array) {
    if (!map.has(item.id) ) {
      map.set(item.id, true); // set any value to Map
      let bigYear = item.fiscalYear
      let filteredItem = array.filter((e=>e.id===item.id && e.fiscalYear > bigYear))[0]
      result.push(filteredItem ? {...filteredItem} : item);
    }
  }
  console.log(result);