JS: объединить три или более последовательных дня недели

#javascript

#javascript

Вопрос:

У меня есть массив, который всегда будет содержать дни недели в качестве входных данных. У меня есть постоянный массив упорядоченных дней недели для сравнения. Сначала я сортирую входной массив, сравнивая индекс массива с массивом const .

Теперь я могу перебирать входной массив, чтобы найти индекс между двумя значениями и определить, являются ли они последовательными. После этого я теряюсь в том, как создать желаемый результат.

Например, у меня есть входной массив:

 [sun, mon, tue, thu, fri]
 

и я хочу вывести как:

 sun to tues, thu, fri
 

Редактировать

Извините, я не опубликовал свою попытку, когда она была опубликована изначально. Пожалуйста, смотрите ниже:

 const days = [
  'sun',
  'mon',
  'tues',
  'wed',
  'thurs',
  'fri',
  'sat',
];

export const combineDays = (inputDays) => {
  const sortedArray = inputDays
    .map((day) => {
      return days.indexOf(day);
    })
    .sort((a, b) => {
      return a - b;
    });

// the string I want to return
  let dayRange = '';
//variable to hold previous day if consecutive
  let rangeEnd = '';
//range position in the loop
  let rangePos = 0;
  sortedArray.forEach((day) => {
    if (dayRange === '') {
      dayRange = days[day];
      rangePos = days.indexOf(days[day])   1;
    } else if (days.indexOf(days[day]) === rangePos) {
      rangeEnd = days[day];
      rangePos  ;
    } else if ((days.indexOf(days[day]) !== rangePos) amp; (rangeEnd !== '')) {
      dayRange = dayRange   ' to '   rangeEnd   ', '   days[day];
      rangePos = days.indexOf(days[day])   1;
      rangeEnd = '';
    } else {
      dayRange = dayRange   ', '   days[day];
      rangeEnd = '';
      rangePos = days.indexOf(days[day])   1;
    }
  });
  return dayRange;
};
 

Ответ №1:

Попробуйте следующий код:

 const array = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];

const inputArray = ['fri','thu', 'sat'];

let indexArray = inputArray.map(item => {
 return array.indexOf(item);
});

let outputArray = indexArray.sort(function(a, b){return a-b}).map(item => 
 array[item]);

// EXPECTED RESULT: ["thu","fri","sat"]
 console.log(outputArray);
 

И все будет работать

Ответ №2:

После нескольких попыток еще несколько часов я заставил его работать, но он не кажется СУХИМ:

 const days = [
  'sun',
  'mon',
  'tue',
  'wed',
  'thu',
  'fri',
  'sat',
];

export const combineDays = (inputDays) => {
  const sortedArray = inputDays
    .map((day) => {
      return days.indexOf(day);
    })
    .sort((a, b) => {
      return a - b;
    });
  let dayRange = '';
  let range = false;
  let rangeEnd = '';
  let rangePos = 0;
  sortedArray.forEach((day, index) => {
    if (dayRange === '') {
      dayRange = days[day];
      rangePos = day   1;
    } else if (day === rangePos) {
      if (rangeEnd !== '') {
        range = true;
      } else {
        range = false;
      }
      if (index !== sortedArray.length - 1) {
        rangeEnd = days[day];
        rangePos  ;
      } else {
        if (range === true) {
          dayRange = dayRange   ' to '   days[day];
        } else if (rangeEnd !== '') {
          dayRange = dayRange   ', '   rangeEnd   ', '   days[day];
        } else {
          dayRange = dayRange   ', '   days[day];
        }
      }
    } else if (day !== rangePos) {
      if (range === true) {
        dayRange = dayRange   ' to '   rangeEnd;
      } else {
        dayRange = dayRange   ', '   rangeEnd;
      }
      dayRange = dayRange   ', '   days[day];
      rangePos = day   1;
      rangeEnd = '';
    }
  });
  return dayRange;
};