【问题标题】:Find max value of a duration field in format HH:MM:SS in Gatsby, Graphql在 Gatsby,Graphql 中以 HH:MM:SS 格式查找持续时间字段的最大值
【发布时间】:2021-11-23 14:00:58
【问题描述】:

我有一个这种格式的 JSON 文件:

[
  {
    "id": 227,
    "duration": "02:52:58"
  },
  {
    "id": 226,
    "duration": "01:30:41"
  }
  ...
]

duration 字段表示 HH:MM:SS 格式的视频长度。

我需要找出持续时间最长的 id。我尝试使用排序和限制,但返回的结果不正确。

// This doesn't work
(
  sort: { fields: [duration], order: DESC }
  limit: 1
)

这里最好的方法是什么?

【问题讨论】:

  • 请@redstuck 对决议发表评论,而不是打开新帖子。赞成/反对/接受答案并提供一些反馈

标签: javascript arrays graphql gatsby


【解决方案1】:

您尝试应用的排序只会按字符串的长度排序,而不是按包含的值排序(因为 GraphQL 不会将其解释为日期或时间戳)。

我认为最简单的方法是在纯 JavaScript 中使用该排序。

一旦你让查询工作,数据将存储在props.data中,所以:

function convertDateObj(hhmmss){
    let date = new Date();

    let [hours, minutes, seconds] = hhmmss.split(':'); 

    date.setHours(+hours); // set the hours, using implicit type coercion
    date.setMinutes(minutes);
    date.setSeconds(seconds);

    return date;
}

const SomePage = ({ data }) => {
  let filteredData= data.someNode.edges.nodes.sort((a, b) => convertDateObj(a.duration) - convertDateObj(b.duration))

console.log(filteredData);

  return <div>Whatever</div>
}

注意:someNode 将代表您的节点,您的问题中未提供该节点。相应地改变它。默认情况下,此方法将按升序对其进行排序。将其更改为convertDateObj(b.duration) - convertDateObj(a.duration)) 使其降序

具有类似用例的其他方法:


感谢@AKX 的建议。这样会更有效率,而且无论哪种方式都可以:

function convertDateObj(hhmmss){   
    let [hours, minutes, seconds] = hhmmss.split(':'); 

    return hours * 60 * 24 + minutes * 60 + seconds;
}

【讨论】:

  • 没有真正的理由为此使用Date -- 只需hours * 60 * 24 + minutes * 60 + seconds 就可以了...
  • 你说的很对@AKX,谢谢你的建议
猜你喜欢
  • 2019-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多