在 Gatsby、Graphql 中以 HH:MM:SS 格式查找持续时间字段的最大值

Find max value of a duration field in format HH:MM:SS in Gatsby, Graphql

我有一个 JSON 格式的文件:

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

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

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

// This doesn't work
(
  sort: { fields: [duration], order: DESC }
  limit: 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)) 使其降序

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

  • JavaScript seconds to time string with format hh:mm:ss

感谢 @AKX 的建议。这会更有效率,并且它会以任何方式工作:

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

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