Возврат строки, основанной на парах ключ-значение объекта - PullRequest
3 голосов
/ 11 июля 2019

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

объект, который возвращается в полезную нагрузку, выглядит следующим образом

{
  sundayUsage: false,
  mondayUsage: true,
  tuesdayUsage: false,
  wednesdayUsage: true,
  thursdayUsage: true,
  fridayUsage: true,
  saturdayUsage: false
}

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

Вот мое текущее решение

function formatSchedule(schedule) {
  let days = []
  let convertedSchedule = Object.keys(schedule).map(x => ({
    available: schedule[x],
    label: x.slice(0, 3).replace(/^[^ ]/g, match => match.toUpperCase())
  }))
  convertedSchedule.map(x => {
    if (x.available) {
      days.push(x.label)
    }
    return days
  })
  if (
    days.includes('Mon' && 'Tue' && 'Wed' && 'Thu' && 'Fri' && 'Sat' && 'Sun')
  ) {
    return 'Everyday'
  } else if (
    days.includes('Mon' && 'Tue' && 'Wed' && 'Thu' && 'Fri') &&
    !days.includes('Sat' && 'Sun')
  ) {
    return 'Weekdays (Mon-Fri)'
  } else if (
    days.includes('Sat' && 'Sun') &&
    !days.includes('Mon' && 'Tue' && 'Wed' && 'Thu' && 'Fri')
  ) {
    return 'Weekends (Sat-Sun)'
  } else return days.join(', ')
}

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

Ответы [ 3 ]

2 голосов
/ 11 июля 2019

Немного другой подход, использующий Boolean как функцию, переданную некоторым / каждому:

function formatSchedule(schedule) {
    const days = Object.values(schedule);
    const weekdays = days.slice(0, 5);
    const weekend = days.slice(-2);

    if (days.every(Boolean)) return 'Everyday';
    else if (weekdays.every(Boolean) && !weekend.some(Boolean)) return 'Weekdays (Mon-Fri)'
    else if (weekend.every(Boolean) && !weekdays.some(Boolean)) return 'Weekends (Sat-Sun)'
    else return Object.entries(schedule)
        .filter(v => v[1])
        .map(v => v[0][0].toUpperCase() + v[0].slice(1, 3))
        .join(', ');
}
1 голос
/ 11 июля 2019

Учитывая, что ваш объект просто содержит логические значения в качестве значений, почему бы просто не использовать это для условий?

function formatSchedule(schedule){
if(schedule.monday&&schedule.tuesday&&schedule.wednesday&&schedule.thursday&&schedule.friday&&schedule.saturday&&schedule.sunday)
  return "Everyday"
if((schedule.monday&&schedule.tuesday&&schedule.wednesday&&schedule.thursday&&schedule.friday)&&!(schedule.saturday||schedule.sunday))
  return "Weekdays"
if(!(schedule.monday||schedule.tuesday||schedule.wednesday||schedule.thursday&&schedule.friday)&&(schedule.saturday&&schedule.sunday))
  return "Weekends"
// Get keys here and return days if other coditions aren't matched here.
}
1 голос
/ 11 июля 2019

Я бы сделал (большие части можно использовать повторно):

  const days = ["monday", "tuesday", "wednesday", ,"thursday", "friday", "saturday", "sunday"];
  const weekdays = days.slice(0, 5);
  const weekend = days.slice(5);

  const every = (a, b) => a.every(it => b.includes(it));
  const some = (a, b) => a.some(it => b.includes(it));

  const capitalize = s => s[0].toUpperCase() + s.slice(1);

  const available = days.filter(day => obj[day + "Usage"]);

  if(available.length === days.length)
    return "Everyday";

  if(every(weekdays, available) && !some(weekend, available))
    return "Weekday";

  if(every(weekend, available) && !some(weekdays, available))
    return "Weekend";

  return available.map(it => capitalize(it.slice(0, 3))).join(", ");

Обратите внимание, что это

days.includes('Sat' && 'Sun')

сначала оценивает && и приводит к последнему значению (если все значения до этого были правдивыми, все непустые строки являются правдивыми), то есть оно равно:

 days.includes('Sun')

и это, очевидно, не то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...