记录一次 @边城大佬 帮我解决的难题。感激大佬,以下是大佬的主页,大家能够关注下。
https://segmentfault.com/u/ja...

我的项目场景:类型蕴含全年和节令,节令是能够配置的,不论抉择年还是节令,都能够新增需要响应数据,弹窗中有两个下拉框,起始时刻和终止时刻,范畴是0-23,抉择一条信息填写完能够点击保留,点击页面中新增能够关上弹窗从新减少信息
遇到问题:
第一次增加数据:如果起始工夫抉择3,终止工夫抉择6进行保留,下次新增时3-6是不能抉择,而且新抉择的工夫范畴不能蕴含3-6,比方新抉择的起始工夫是1,终止工夫是9,因为1-9蕴含了3-6的局部,所以不能抉择,然而0-3能够抉择,7-10能够抉择。
第二次增加数据:如果起始工夫抉择9,终止工夫抉择14进行保留,这时新增的全副数据是:

hasAddData = [    {startTime: 3, endTime: 6, upValue: 1,downValue: 0.3},    {startTime: 9, endTime: 14, upValue: 0.5,downValue: 0.8},]

下次新增时,只能抉择的数据列表为: [0,1,2],[7,8],[15,16,17,18,19,20,21,22,23],如果起始时刻抉择0,终止时刻只能是0、1或者2,如果起始时刻抉择是7,终止时刻只能是8。
以此类推,写出起始时刻的下拉框数据和终止时刻的下拉框数据。
弹窗图示:

以下是实现逻辑:

<template>  <div class="addTime">    <el-dialog      title="新增需要响应时段"      :visible.sync="showAddDialog.visible"      :close-on-click-modal="false"      :close-on-press-escape="false"      :modal-append-to-body="false"      :append-to-body="true"      width="450px"      top="20vh"      v-loading="formLoading"    >      <el-form        size="mini"        label-position="left"        label-width="140px"        :model="timeInfoForm"        :rules="timeRules"        ref="timeInfoForm"      >        <el-form-item          label="节令"          prop="season"          v-if="showAddDialog.type === 2"        >          <el-select            v-model="timeInfoForm.season"            placeholder="请抉择节令"            style="width: 245px"            @change="handleSeasonChange"          >            <el-option              v-for="item in seasonList"              :key="item"              :label="item"              :value="item"            ></el-option>          </el-select>        </el-form-item>        <el-form-item label="起始时刻" prop="st">          <el-select            v-model="timeInfoForm.st"            placeholder="请抉择起始时刻"            style="width: 245px; margin-right: 5px"            @change="handleStartChange"          >            <el-option              v-for="item in stList"              :key="item"              :label="item"              :value="item"            ></el-option> </el-select          >时        </el-form-item>        <el-form-item label="终止时刻" prop="et">          <el-select            v-model="timeInfoForm.et"            placeholder="请抉择终止时刻"            style="width: 245px; margin-right: 5px"          >            <el-option              v-for="item in etList"              :key="item"              :label="item"              :value="item"            ></el-option> </el-select          >时        </el-form-item>        <el-form-item label="可上调电负荷比例" prop="up">          <el-input            v-model.trim="timeInfoForm.up"            placeholder="0-1之间"            clearable            style="width: 245px"          >          </el-input>        </el-form-item>        <el-form-item label="可下调电负荷比例" prop="down">          <el-input            v-model.trim="timeInfoForm.down"            placeholder="0-1之间"            clearable            style="width: 245px"          >          </el-input>        </el-form-item>      </el-form>      <div slot="footer">        <el-button type="reset" @click="handleFormCancel" size="small"          >取 消</el-button        >        <el-button type="primary" @click="handleFormSubmit" size="small"          >保 存</el-button        >      </div>    </el-dialog>  </div></template>
export default {  name: "addTime",  props: {    showAddDialog: {      type: Object,      default: () => {},    },  },  data() {    return {      formLoading: false,      timeInfoForm: {        season: "",        st: "",        et: "",        up: "",        down: "",      },      seasonList: [],      hasAddData: [], // 已增加数据    };  },  created() {    // data是父组件传递过去曾经增加的数据    let data = this.$deepClone(this.showAddDialog.data);    // type---> 1年,2节令    if (this.showAddDialog.type == 2) {      // columns是父组件传递过去的节令数据      this.seasonList = this.showAddDialog.columns;      this.timeInfoForm.season = this.seasonList[0];      this.handleDataFormat();    } else {      this.hasAddData = data;    }  },  computed: {    // 获取默认的0-23小时数据    getAllTimeData() {      let arr = [];      for (let i = 0; i <= 23; i++) {        arr.push(i);      }      return arr;    },    // 获取起始时刻的数据    stList() {      return this.getAllTimeData.filter((t) =>        this.hasAddData.every(({ st, et }) => t < st || t > et)      );    },    // 获取终止时刻的数据    etList() {      let start = this.timeInfoForm.st;      let startIndex = this.stList.indexOf(start);      return this.stList.filter(        (t, i) => t >= start && t - start === i - startIndex      );    },  },  methods: {    // 切换起始工夫    handleStartChange() {      this.timeInfoForm.et = "";    },    // 节令格式化数据    handleDataFormat() {      let data = this.$deepClone(this.showAddDialog.data);      // 应用reduce函数,将数据分组      /**        let arr = {          秋季: [            {season: "秋季", st: 12, et: 15, up: 0.2, down: 0.4}            {season: "秋季", st: 18, et: 21, up: 1, down: 1}          ],          冬季: [            {season: "冬季", st: 12, et: 15, up: 0.2, down: 0.4}          ],          秋季: [],          夏季: []        }     */      let arr = data.reduce((prev, curr) => {        let key = curr["season"];        if (!prev[key]) {          prev[key] = [];        }        prev[key].push(curr);        return prev;      }, {});      // 如果该节令下没有数据,则应用默认的0-23小时数据      if (!arr[this.timeInfoForm.season]) {        this.hasAddData = [];      } else {        this.hasAddData = arr[this.timeInfoForm.season];      }    },    // 切换节令    handleSeasonChange(val) {      this.timeInfoForm.season = val;      this.handleDataFormat();    },  },};

次要逻辑是计算出起始时刻和终止时刻,脑子中有一些想法,然而代码总是编写有问题,因而记录下大佬的编码,再次感激边城大佬的帮忙。