Как получить уникальные предметы в зависимости от состояния - PullRequest
0 голосов
/ 12 июля 2020

У меня есть фрагмент 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 }
]

Требуется оптимальное решение, даже если данные большие

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Вам просто нужно добавить еще один фильтр в l oop,

  let bigYear = item.fiscalYear

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

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

Final Snippet будет выглядеть одинаково,

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);
0 голосов
/ 12 июля 2020

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);
...