【问题标题】:How to get value of an item in an JSON sub-array based on latest date not more than given Date如何根据不超过给定日期的最新日期获取 JSON 子数组中项目的值
【发布时间】:2020-07-10 15:00:13
【问题描述】:

我正在使用 Angular 开发一个计费应用程序。我的 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"
    }]

我希望它返回 latest applicableFrom 日期的 stdRate,直到 itemStdRate 的子数组中的给定日期。

【问题讨论】:

  • "items" 是一个对象,而不是一个数组。如果您希望在过滤到正确的 itemStdRate 方面获得帮助,请提供一个准确形成的对象/数组/无论如何实际返回的东西。
  • 您能分享一下您尝试实现相同目标的代码吗?
  • 为了实现你想要的,我认为你必须改变你的数据结构,使itmStdRate 成为一个数组。然后您可以通过applicableFrom 属性对数组进行排序,然后与输入日期进行比较
  • 您的示例不是JSON(尝试使用任何在线 JSON 解析器对其进行解析 - 您会收到错误消息)。它不是Array,也不是Object(至少在JavaScript 中不是)。它类似于JSONObject,但看起来您是从不尊重格式的来源复制的(例如console
  • 这只是对象数组的一部分..

标签: javascript arrays json angular


【解决方案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: [{
        _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 ***/

【讨论】:

  • 好的,谢谢,但这只会让我知道最大日期的比率。数据也可能有未来的日期。我想要今天的最大日期,但小于或等于给定日期。
  • @WinlightSolutions 如果您想在某个日期之前获取所有项目,您只需根据该日期过滤您的项目。 sn-p就是按照这个来更新的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多