Как отфильтровать повторяющиеся значения и получить самый последний объект транзакции, используя фильтр JS? - PullRequest
0 голосов
/ 11 января 2019

Используя приведенный ниже код, я смог получить дубликат, но я пытаюсь получить самый последний объект из каждого препарата, используя свойство transactionDate. Ниже приведен код, который фильтрует только дубликаты любой идеи о том, как получить самую последнюю транзакцию для каждого препарата.

main.js

var drugsArray =  [{
  drugName: "ADVIL",
  transactionDate: "2018-12-15"
},{
  drugName: "ADVIL",
  transactionDate: "2018-12-28"
}, 
 {
  drugName: "ATRIPLA",
  transactionDate: "2018-12-05"
},{
  drugName: "ATRIPLA",
  transactionDate: "2018-12-21"
}

];

function getDrugs(data) {

 let filtered = data.reduce((accumulator, current) => {
  if (! accumulator.find(({drugName}) => drugName === current.drugName)) {
    var checkRecentDate = getLatestDateSave(current.transactionDate)
    if(checkRecentDate) {
      accumulator.push(current);
    }

  }
  return accumulator;
}, []);

  console.log(filtered);
}


getDrugs(drugsArray);

получить объект последней даты с помощью этой функции

function getLatestDateSave(xs) {
   if (xs.length) {
      return xs.reduce(function(m, i) {
         return (i.MeasureDate > m) && i || m;
      }, "").MeasureDate;
   }
 }

Ожидаемый результат -

result = [{
        drugName: "ADVIL",
        transactionDate: "2018-12-28"
    },
    {
        drugName: "ATRIPLA",
        transactionDate: "2018-12-21"
    }

];

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Вы можете подойти к этому с помощью метода redu () . Кроме того, с форматом, который вы используете для дат, их можно сравнивать непосредственно как строки. Пример:

var drugsArray =  [
    {drugName: "ADVIL", transactionDate: "2018-12-15"},
    {drugName: "ADVIL", transactionDate: "2018-12-28"},
    {drugName: "ATRIPLA", transactionDate: "2018-12-05"},
    {drugName: "ATRIPLA", transactionDate: "2018-12-21"}
];

let result = drugsArray.reduce((res, curr) =>
{
    let exists = res.findIndex(x => x.drugName === curr.drugName);

    if (exists < 0)
        res.push(curr);
    else if (res[exists].transactionDate < curr.transactionDate)
        res[exists].transactionDate = curr.transactionDate;

    return res;
        
}, []);

console.log(result);
0 голосов
/ 11 января 2019

Вы можете сначала сгруппировать транзакции в объект массивов, затем отсортировать даты в порядке убывания и выбрать первую:

const drugsArray = [{
    drugName: "ADVIL",
    transactionDate: "2018-12-15"
  }, {
    drugName: "ADVIL",
    transactionDate: "2018-12-28"
  },
  {
    drugName: "ATRIPLA",
    transactionDate: "2018-12-05"
  }, {
    drugName: "ATRIPLA",
    transactionDate: "2018-12-21"
  }
];

// First group the transactions into an object of arrays
const transactionMap = {};
for (const obj of drugsArray) {
  const key = obj.drugName;
  if (!transactionMap[key]) {
    transactionMap[key] = [];
  }
  transactionMap[key].push(obj);
}

// Then sort each group by transaction date and pick the first one
const result = [];
for (const obj in transactionMap) {
  transactionMap[obj].sort(function(a, b) {
    return new Date(b.transactionDate) - new Date(a.transactionDate);
  });
  result.push(transactionMap[obj][0]);
}

console.log(result);
0 голосов
/ 11 января 2019

Я отсортировал массив по дате транзакции, а затем по имени. Затем я выбрал метод фильтра дубликатов в этом потоке , который отфильтровывает первый найденный элемент в дублирующем наборе.

var drugsArray =  [{
  drugName: "ADVIL",
  transactionDate: "2018-12-15"
},{
  drugName: "ADVIL",
  transactionDate: "2018-12-28"
}, 
{
  drugName: "ATRIPLA",
  transactionDate: "2018-12-05"
},{
  drugName: "ATRIPLA",
  transactionDate: "2018-12-21"
},
{
  drugName: "AMBIEN",
  transactionDate: "2018-02-05"
},{
  drugName: "AMBIEN",
  transactionDate: "2018-12-06"
}

];

function getDrugs(){
    const output = drugsArray
    .sort(function(d1, d2){
      return new Date(d1.transactionDate) < new Date(d2.transactionDate) ? 1 : -1;
    })
    .sort(function(d1, d2){
      return d1.drugName < d2.drugName ? -1 : 1;
    })
    .filter(function(value, index, self) { 
        return index === self.findIndex(function(i){
          return i.drugName === value.drugName
        })
    });
    
    return output;
}

console.log(getDrugs());

Теперь это только оценивает даты как строки. Вы можете неявно преобразовывать строки даты в объекты Date перед сравнением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...