DataTables - 基于时间跨度的过滤

时间:2018-05-08 09:26:31

标签: datatables

我在数据表中有一个包含数据的列,类似于下面的内容:

0500-1300
0500-1430
0600-0915
0600-1000
0600-1100
0600-1115
0600-1130
0600-1200
0600-1215
0600-1300
0600-1315

我希望过滤器与http://yadcf-showcase.appspot.com/dom_bootstrap_time.html不太相似,有人可以选择FROM时间和TO时间,然后过滤数据。

让我们说有人选择:

FROM: 0600
TO: 1100

然后只会显示3个。但是,如果我选择:

FROM: 0500
TO: 1400

所有人都会表现出来。这样的事情可能吗?上面网站的插件会不会是我追求的?

1 个答案:

答案 0 :(得分:1)

试试这个:

const timeStringToInt = (time) => {
  const hoursMinutes = time.split(/[.:]/);
  const hours = parseInt(hoursMinutes[0], 10) * 60;
  var minutes = parseInt(hoursMinutes[1], 10);
  return hours + minutes;
}

$.fn.dataTable.ext.search.push(
  (settings, data, dataIndex) => {
    const min = timeStringToInt($('#timeFrom').val());
    const max = timeStringToInt($('#timeTo').val());
    const start = timeStringToInt(data[0]);
    const end = timeStringToInt(data[1]);
    return start >= min && end <= max;
  }
);

您可能需要根据小时列的位置更改功能。工作JSFiddle here

修改

在查看你的数据后,我在最初的答案中犯了一个错误,这应该是这样做的:

const timeStringToInt = (time) => {
  const hoursMinutes = time.split(":");
  const hours = parseInt(hoursMinutes[0], 10) * 60;
  var minutes = parseInt(hoursMinutes[1], 10);
  return hours + minutes;
}
const stringToInt = (time) => {
  var minutes = parseInt(time.slice(-2), 10);
  const hours = parseInt(time.slice(0, -2), 10) * 60;
  return hours + minutes;
}

$.fn.dataTable.ext.search.push(
  (settings, data, dataIndex) => {
    const min = timeStringToInt($('#timeFrom').val());
    const max = timeStringToInt($('#timeTo').val());
    const timeParts = data[0].split("-");
    const start = stringToInt(timeParts[0]);
    const end = stringToInt(timeParts[1]);
    return start >= min && end <= max;
  }
);

更新了JSFiddle here

希望有所帮助: - )