简体   繁体   English

JavaScript - 数组切片:基于不同范围的过滤器

[英]JavaScript - Array Slicing: based on a filter for different range

I have an array of objects as following:我有一个对象数组如下:

Array:大批:

[
  {
    "isChecked": false,
    "title": "00:00"
  },
  {
    "isChecked": false,
    "title": "00:30"
  },
  {
    "isChecked": false,
    "title": "01:00"
  },
  {
    "isChecked": false,
    "title": "01:30"
  },
  {
    "isChecked": false,
    "title": "02:00"
  },
  {
    "isChecked": false,
    "title": "02:30"
  },
  {
    "isChecked": false,
    "title": "03:00"
  },
  {
    "isChecked": false,
    "title": "03:30"
  },
  {
    "isChecked": false,
    "title": "04:00"
  },
  {
    "isChecked": false,
    "title": "04:30"
  },
  {
    "isChecked": false,
    "title": "05:00"
  },
  {
    "isChecked": false,
    "title": "05:30"
  },
  {
    "isChecked": false,
    "title": "06:00"
  },
  {
    "isChecked": false,
    "title": "06:30"
  },
  {
    "isChecked": false,
    "title": "07:00"
  },
  {
    "isChecked": false,
    "title": "07:30"
  },
  {
    "isChecked": false,
    "title": "08:00"
  },
  {
    "isChecked": false,
    "title": "08:30"
  },
  {
    "isChecked": false,
    "title": "09:00"
  },
  {
    "isChecked": false,
    "title": "09:30"
  },
  {
    "isChecked": false,
    "title": "10:00"
  },
  {
    "isChecked": false,
    "title": "10:30"
  },
  {
    "isChecked": false,
    "title": "11:00"
  },
  {
    "isChecked": false,
    "title": "11:30"
  }
]

UI: It is displaying like this:用户界面:它显示如下:

在此处输入图片说明

User Action: When user select any time slots, like this:用户操作:当用户选择任何时间段时,如下所示: 在此处输入图片说明

The Array will then have some checked times.然后数组将有一些检查时间。

[
  {
    "isChecked": true,
    "title": "00:00"
  },
  {
    "isChecked": true,
    "title": "00:30"
  },
  {
    "isChecked": true,
    "title": "01:00"
  },
  {
    "isChecked": true,
    "title": "01:30"
  },
  {
    "isChecked": true,
    "title": "02:00"
  },
  {
    "isChecked": false,
    "title": "02:30"
  },
  {
    "isChecked": false,
    "title": "03:00"
  },
  {
    "isChecked": false,
    "title": "03:30"
  },
  {
    "isChecked": false,
    "title": "04:00"
  },
  {
    "isChecked": false,
    "title": "04:30"
  },
  {
    "isChecked": false,
    "title": "05:00"
  },
  {
    "isChecked": false,
    "title": "05:30"
  },
  {
    "isChecked": false,
    "title": "06:00"
  },
  {
    "isChecked": false,
    "title": "06:30"
  },
  {
    "isChecked": true,
    "title": "07:00"
  },
  {
    "isChecked": true,
    "title": "07:30"
  },
  {
    "isChecked": true,
    "title": "08:00"
  },
  {
    "isChecked": true,
    "title": "08:30"
  },
  {
    "isChecked": true,
    "title": "09:00"
  },
  {
    "isChecked": false,
    "title": "09:30"
  },
  {
    "isChecked": true,
    "title": "10:00"
  },
  {
    "isChecked": true,
    "title": "10:30"
  },
  {
    "isChecked": true,
    "title": "11:00"
  },
  {
    "isChecked": false,
    "title": "11:30"
  }
]

What I Want: A list of all time sessions ( start -to- end ), based on the selected time slots:我想要的:所有时间段的列表(从开始到结束),基于选定的时间段:

output:输出:

[
  {
    "StartTime": "00:00",
    "EndTime": "02:00"
  },
{
    "StartTime": "07:00",
    "EndTime": "09:00"
  },
{
    "StartTime": "10:00",
    "EndTime": "11:00"
  },
]

I have tried it a little bit, but not getting the desired output.我已经尝试了一点,但没有得到所需的输出。

here is the link of my code https://stackblitz.com/edit/ngoninit-wvnjfk这是我的代码的链接https://stackblitz.com/edit/ngoninit-wvnjfk

Your help will be highly appreciated !您的帮助将不胜感激!

You could check the slot and predecessor and add a new object or update the last object.您可以检查插槽和前身并添加新对象或更新最后一个对象。

 var data = [{ isChecked: true, title: "00:00" }, { isChecked: true, title: "00:30" }, { isChecked: true, title: "01:00" }, { isChecked: true, title: "01:30" }, { isChecked: true, title: "02:00" }, { isChecked: false, title: "02:30" }, { isChecked: false, title: "03:00" }, { isChecked: false, title: "03:30" }, { isChecked: false, title: "04:00" }, { isChecked: false, title: "04:30" }, { isChecked: false, title: "05:00" }, { isChecked: false, title: "05:30" }, { isChecked: false, title: "06:00" }, { isChecked: false, title: "06:30" }, { isChecked: true, title: "07:00" }, { isChecked: true, title: "07:30" }, { isChecked: true, title: "08:00" }, { isChecked: true, title: "08:30" }, { isChecked: true, title: "09:00" }, { isChecked: false, title: "09:30" }, { isChecked: true, title: "10:00" }, { isChecked: true, title: "10:30" }, { isChecked: true, title: "11:00" }, { isChecked: false, title: "11:30" }], result = data.reduce((r, { isChecked, title }, i, a) => { if (!isChecked) return r; if (!i || !a[i - 1].isChecked) r.push({ StartTime: title, EndTime: title }); else r[r.length - 1].EndTime = title; return r; }, []); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

Solution using js reduce.使用js reduce的解决方案。 Chunk array then take first and last time.块数组然后取第一次和最后一次。

 const data=[{"isChecked":!0,"title":"00:00"},{"isChecked":!0,"title":"00:30"},{"isChecked":!0,"title":"01:00"},{"isChecked":!0,"title":"01:30"},{"isChecked":!0,"title":"02:00"},{"isChecked":!1,"title":"02:30"},{"isChecked":!1,"title":"03:00"},{"isChecked":!1,"title":"03:30"},{"isChecked":!1,"title":"04:00"},{"isChecked":!1,"title":"04:30"},{"isChecked":!1,"title":"05:00"},{"isChecked":!1,"title":"05:30"},{"isChecked":!1,"title":"06:00"},{"isChecked":!1,"title":"06:30"},{"isChecked":!0,"title":"07:00"},{"isChecked":!0,"title":"07:30"},{"isChecked":!0,"title":"08:00"},{"isChecked":!0,"title":"08:30"},{"isChecked":!0,"title":"09:00"},{"isChecked":!1,"title":"09:30"},{"isChecked":!0,"title":"10:00"},{"isChecked":!0,"title":"10:30"},{"isChecked":!0,"title":"11:00"},{"isChecked":!1,"title":"11:30"}]; const result = data.reduce(({ curr, times }, n) => { if (curr != n.isChecked && n.isChecked) times.push([]); if (n.isChecked) times[times.length-1].push(n.title); return { curr: n.isChecked, times }; }, { curr: false, times: [] }).times.map(range => ({ StartTime: range[0], EndTime: range[range.length-1] })); console.log(result);

You can reduce the time slot dataset and return time blocks based on the current and previous time slots.您可以减少时隙数据集并根据当前和以前的时隙返回时间块。

  1. Just check for isChecked and add a new block, if the previous slot was not checked.如果没有检查前一个插槽,只需检查isChecked并添加一个新块。
  2. If the current one is not checked, but the previous one was, finish the time block.如果当前没有被选中,而前一个被选中,则完成时间块。

 const expected = getExpected(), actual = calculateTimeBlocks(getInput()); console.log('Equal?:', JSON.stringify(actual) === JSON.stringify(expected)); console.log(actual); function calculateTimeBlocks(timeSlots) { return timeSlots.reduce((blocks, curr, index, arr) => { let prev = index > 0 ? arr[index - 1] : null; if (curr.isChecked) { if (!prev || !prev.isChecked) { blocks.push({ "StartTime" : curr.title }); } } else { if (prev && prev.isChecked) { Object.assign(blocks[blocks.length - 1], { ["EndTime"] : prev.title }); } } return blocks; }, []); } function getInput() { return [ { "isChecked": true, "title": "00:00" }, { "isChecked": true, "title": "00:30" }, { "isChecked": true, "title": "01:00" }, { "isChecked": true, "title": "01:30" }, { "isChecked": true, "title": "02:00" }, { "isChecked": false, "title": "02:30" }, { "isChecked": false, "title": "03:00" }, { "isChecked": false, "title": "03:30" }, { "isChecked": false, "title": "04:00" }, { "isChecked": false, "title": "04:30" }, { "isChecked": false, "title": "05:00" }, { "isChecked": false, "title": "05:30" }, { "isChecked": false, "title": "06:00" }, { "isChecked": false, "title": "06:30" }, { "isChecked": true, "title": "07:00" }, { "isChecked": true, "title": "07:30" }, { "isChecked": true, "title": "08:00" }, { "isChecked": true, "title": "08:30" }, { "isChecked": true, "title": "09:00" }, { "isChecked": false, "title": "09:30" }, { "isChecked": true, "title": "10:00" }, { "isChecked": true, "title": "10:30" }, { "isChecked": true, "title": "11:00" }, { "isChecked": false, "title": "11:30" } ]; } function getExpected() { return [ { "StartTime": "00:00", "EndTime": "02:00" }, { "StartTime": "07:00", "EndTime": "09:00" }, { "StartTime": "10:00", "EndTime": "11:00" }, ]; }
 .as-console-wrapper { top: 0; max-height: 100% !important; }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM