У моей функции есть проблема, которую я не могу исправить. На данный момент он говорит, что невозможно прочитать свойство 'split' из undefined в слотах соединения. - PullRequest
1 голос
/ 09 мая 2020

Я использую функцию

function joinslots(freeTimings){
    joined=[];
    if(freeTimings.length==1){
        joined.push(freeTimings);
}
    if(freeTimings.length>1){
        for(i=0;i<=freeTimings.length;){
        //console.log(freeTimings[i]);
        time0=freeTimings[i].split("-");
        first0=time0[0];
        last0=time0[1];
        time1=freeTimings[i+1].split("-");
        first1=time1[0];
        last1=time1[1];
        if(last0==first1){
            newfirst=first0;
            newlast=last1;
            newtime = newfirst+"-"+newlast;
            joined.push(newtime);
            if(i+2<freeTimings.length){
            time2=freeTimings[i+2]
            first2=time2[0];
            last2=time2[1];
            if(first2==last1){
                 i=i+2;
            }
            else i++;
            }
            else i+=2;
        }
        else{
            joined.push(freeTimings[i]);
            i++;
        }  
        if(i==freeTimings.length-1){
            joined.push(freeTimings[i-1]);
            break;
        }      

    }

    }
    return joined;    



}

Входными данными для этой функции являются 30-минутные интервалы времени, и она должна возвращать объединенные интервалы за один час везде, где это возможно. Каждый раз, когда я исправляю ошибку, возникает другая, что заставляет меня думать, что здесь есть основная проблема, которую я не могу понять, кроме, возможно, выхода массива за границы, для которых я сохранил оператор if.

Например, ввод:

freeTimings=["8:00-8:30","8:30-9:00","9:00-9:30","12:00-12:30","12:30-13:00","13:00-13:30","13:30-14:00","14-14:30","15:30-16:00","16:00-16:30","17:30-18:00"]

возвращаемое значение должно быть

joined=["8:00-9:00","9:00-9:30","12:00-13:00","13:00-14:00","14:00-14:30","15:30-16:30","17:30-18:00"]

Поэтому любая помощь с исправлением моей функции будет оценена :)

1 Ответ

1 голос
/ 09 мая 2020

Метод записи slotMerge для проверки возможности объединения двух временных строк. если можно выполнить слияние, верните объединенный слот, в противном случае верните пустую строку.

С помощью этого метода Go через массив и проталкивание объединенных или не объединенных слотов в выходной массив.

Как это помогает.

const freeTimings = [
  "8:00-8:30",
  "8:30-9:00",
  "9:00-9:30",
  "12:00-12:30",
  "12:30-13:00",
  "13:00-13:30",
  "13:30-14:00",
  "14-14:30",
  "15:30-16:00",
  "16:00-16:30",
  "17:30-18:00"
];

const joinSlots = data => {
  const slotMerge = (str1, str2) => {
    const [start1, end1] = str1.split("-");
    const [start2, end2] = str2.split("-");
    return end1 === start2 ? `${start1}-${end2}` : "";
  };
  const output = [];
  let prev = data[0];
  for (let i = 1; i < data.length; i++) {
    const curr = data[i];
    const mer = slotMerge(prev, curr);
    if (mer) {
      output.push(mer);
      prev = i + 1 < data.length ? data[i + 1] : undefined;
      i += 1;
    } else {
      output.push(prev);
      prev = curr;
    }
  }
  if (prev) {
    output.push(prev);
  }
  return output;
};

console.log(joinSlots(freeTimings));
...