Как получить значение элемента в подмассиве JSON на основе последней даты, не более указанной даты - PullRequest
0 голосов
/ 10 июля 2020

Я работаю над биллингом, используя Angular. Массив My items возвращается следующим образом (здесь частично показан 1 элемент): -

    items: [{
       _id: "5ee2298f59ce2e1747cb5539"
        createdAt: "2020-06-11T12:54:40.031Z"
        itemDescription: "White Bread of small size."
        itemGroup: {_id: "5ec7bab54794600d9f4cd24f", itemGroupName: "Breads White"}
        itemName: "Bread White - Small Slice"
        itemStdRate:
        0: {_id: "5eff39485c73781aa1b0b60f", stdRate: 20, applicableFrom: "2020-07-28T18:30:00.000Z"}
        1: {_id: "5f02d64ccc5e5f15bfb73f41", stdRate: 18, applicableFrom: "2020-07-06T07:43:58.446Z"}
        length: 2
        itemUnit: {_id: "5ec932fe54799a1e7bbe9cd5", itemUnitSymbol: "nos", itemUnitName: "Numbers"}
        updatedAt: "2020-07-06T13:02:01.369Z"
    }]

Я хочу, чтобы он возвращал stdRate из latest applyFrom дата до заданной даты из подматрицы itemStdRate.

1 Ответ

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

Если предположить, что ваши реальные данные выглядят примерно так:

{
  items: [{
    _id: "5ee2298f59ce2e1747cb5539",
    createdAt: "2020-06-11T12:54:40.031Z",
    itemDescription: "White Bread of small size.",
    itemGroup: {
      _id: "5ec7bab54794600d9f4cd24f",
      itemGroupName: "Breads White"
    },
    itemName: "Bread White - Small Slice",
    itemStdRate: [{
        _id: "5eff39485c73781aa1b0b60f",
        stdRate: 20,
        applicableFrom: "2020-07-28T18:30:00.000Z"
      }, {
        _id: "5f02d64ccc5e5f15bfb73f41",
        stdRate: 18,
        applicableFrom: "2020-07-06T07:43:58.446Z"
      }
    ],
    length: 2,
    itemUnit: {
      _id:"5ec932fe54799a1e7bbe9cd5",
      itemUnitSymbol: "nos",
      itemUnitName: "Numbers"
    },
    updatedAt: "2020-07-06T13:02:01.369Z",
  }]
}

Тогда вы можете создать функцию фильтрации следующим образом:

const { items } = {
  items: [{
    _id: "5ee2298f59ce2e1747cb5539",
    createdAt: "2020-06-11T12:54:40.031Z",
    itemDescription: "White Bread of small size.",
    itemGroup: {
      _id: "5ec7bab54794600d9f4cd24f",
      itemGroupName: "Breads White"
    },
    itemName: "Bread White - Small Slice",
    itemStdRate: [{
      _id: "5eff39485c73781aa1b0b60f",
      stdRate: 20,
      applicableFrom: "2020-07-28T18:30:00.000Z"
    }, {
      _id: "5f02d64ccc5e5f15bfb73f41",
      stdRate: 18,
      applicableFrom: "2020-07-06T07:43:58.446Z"
    }],
    length: 2,
    itemUnit: {
      _id: "5ec932fe54799a1e7bbe9cd5",
      itemUnitSymbol: "nos",
      itemUnitName: "Numbers"
    },
    updatedAt: "2020-07-06T13:02:01.369Z",
  }]
}


/*** ORIGINAL ANSWER BEGIN ***/
// latest date code source: https://stackoverflow.com/questions/36577205/what-is-the-elegant-way-to-get-the-latest-date-from-array-of-objects-in-client-s
/*const getLatestDate = (itemStdRate) => {
  return Math.max.apply(null, itemStdRate.map(function(e) {
    return new Date(e.applicableFrom);
  }))
}

const latestStdRates = items.map(({
  itemStdRate
}) => {
  const latest = getLatestDate(itemStdRate)
  return itemStdRate.find(e => new Date(e.applicableFrom).getTime() === latest)
})*/
/*** ORIGINAL ANSWER END ***/

/*** NEW ANSWER BEGIN ***/
// all dates before a given date
const datesBefore = (items, dateBefore) => {
  return items.map(({ itemStdRate }) => {
    return itemStdRate.filter(({ applicableFrom }) => {
      return new Date(applicableFrom) <= new Date(dateBefore)
    })
  })
}

console.log('date now:', datesBefore(items, Date.now()))
console.log('2020-07-29:', datesBefore(items, new Date("2020-07-29")))
/*** NEW ANSWER END ***/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...