JS如何将数组对象中id相同且存在时间交集的元素取出来?

小黄人
  • 57

例:

[{
          id: 1,
          start: '2020-11-20',
          end: '2020-11-23',
        }, {
          id: 2,
          start: '2020-11-20',
          end: '2020-11-24',
        }, {
          id: 1,
          start: '2020-11-21',
          end: '2020-11-25',
        }]

如何优雅的取出id相同且存在时间交集的元素?
我目前想到的是都转换成时间戳再一一比对,有没有更优的解法呢?

回复
阅读 1.1k
2 个回答

时间的比较不需要转时间戳,直接比大小就会得true或者false,
时间交集提供一个简单的思路,用第二数据的开始时间和第一个数据的结束时间比大小,如果得到true说明存在区间,false说明不存在

function find (input = []) {
  const output = new Set();
  Array
    .from(input)
    .sort(
      (m, n) =>
        m.id - n.id ||
        (m.start < n.end || m.end > n.start) &&
        output.add(m) && output.add(n),
    );
  return Array.from(output);
}
宣传栏