Javascript 基于对象的键值对返回字符串

Javascript 基于对象的键值对返回字符串,javascript,object,formatting,Javascript,Object,Formatting,我当前从一个有效负载接收一个对象,我希望根据该对象内的值将其格式化为一个字符串。我有一个解决方案,但我不是一个真正的球迷,并知道有可能有一个更实际的方法来解决这个问题 返回有效载荷的对象如下所示 { sundayUsage: false, mondayUsage: true, tuesdayUsage: false, wednesdayUsage: true, thursdayUsage: true, fridayUsage: true, saturdayUsage:

我当前从一个有效负载接收一个对象,我希望根据该对象内的值将其格式化为一个字符串。我有一个解决方案,但我不是一个真正的球迷,并知道有可能有一个更实际的方法来解决这个问题

返回有效载荷的对象如下所示

{
  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(', ')
}
我不认为引入外部库是必要的,但如果它最终成为这项工作的正确工具,我愿意寻求建议。

我愿意(大部件可以重复使用):


请注意

days.includes('Sat' && 'Sun')
将首先计算
&&
并生成最后一个值(如果之前的所有值都是truthy,则所有非空字符串都是truthy),因此其与:

 days.includes('Sun')

这显然不是您想要的。

既然您的对象只包含布尔值,为什么不将其用于条件呢

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.
}

略微不同的方法,使用
布尔值
作为传递给某些/每个的函数:

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(', ');
}

预期结果就在发布的代码中。这不可能按预期工作<代码>天。包括('Sat')和('Sun')是
天。包括('Sun')
,而不是
天。包括('Sat')&&days。包括('Sun')
,而不是构建一个数组,我会将每天视为一个特定的不同位位置并构建一个数字。然后你可以做一个简单的查找。我再次编辑了,因为在你的两个条件下,否定不会发生在同一个地方。现在,它起作用了!很抱歉。我应该更加小心我写的东西。没问题。我们主要是来帮忙的!很好地抓住了这个机会。我肯定不知道它是这样工作的
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(', ');
}