在 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;
}
我有一个 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;
}