【问题标题】:How to slice an array with wrapping?如何用包装对数组进行切片?
【发布时间】:2020-06-19 07:52:13
【问题描述】:

我有这几天:

const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']

我需要一个可以捕获(包括)2 个指定天数之间的所有天数的函数。例如:

function getDaysBetween(day1, day2) {
  return days.slice(days.indexOf(day1), days.indexOf(day2) + 1);
}

这行得通:

getDaysBetween('Monday', 'Thursday');
// ['Monday', 'Tuesday', 'Wednesday', 'Thursday']

但这不是:

getDaysBetween('Saturday', 'Monday');
// []
// should be ['Saturday', 'Sunday', 'Monday']

如果第一天的索引大于第二天的索引,则返回一个空数组。

如何修复此功能以产生我需要的结果?

【问题讨论】:

    标签: javascript arrays slice


    【解决方案1】:

    另一种调整结束索引的方法。

    function getDaysBetween(day1, day2) {
        const
            start = days.indexOf(day1),
            end = days.indexOf(day2) + 1;
    
        return [...days, ...days].slice(start, end < start ? end + days.length : end);
    }
    
    const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    
    
    console.log(getDaysBetween('Monday', 'Thursday')); // ['Monday', 'Tuesday', 'Wednesday', 'Thursday']
    console.log(getDaysBetween('Saturday', 'Monday')); // ['Saturday', 'Sunday', 'Monday']
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 为什么var
    【解决方案2】:

    当第二天索引小于第一天索引时,可以从第一个索引开始,一直到第二个索引。

    function getDaysBetween(day1, day2) {
      let day1Index = days.indexOf(day1);
      let day2Index = days.indexOf(day2);
      if (day2Index < day1Index) {
        return days.slice(day1Index, days.length).concat(days.slice(0, day2Index + 1));
      } else {
        return days.slice(days.indexOf(day1), days.indexOf(day2) + 1);
      }
    }
    

    【讨论】:

      【解决方案3】:

      基于两周安排和Array.indexOf 的第二个参数的简短解决方案。

      (我完全编辑了我的第一个答案。这是另一种方法。)

      const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
      
      
      function getDaysBetween(day1, day2) {
      
        let twoWeeks = [...days, ...days];  
         return twoWeeks.slice(twoWeeks.indexOf(day1), twoWeeks.indexOf(day2, twoWeeks.indexOf(day1)) + 1 );
      }
      
      
      console.log(getDaysBetween('Monday', 'Thursday'));
      console.log(getDaysBetween('Saturday', 'Monday'));

      【讨论】:

      • 我像这样重写了你的第三行,因为它看起来更酷:d1 &gt; d2 &amp;&amp; ([d2, d1] = [d1, d2]);
      • 这不起作用。它第二次返回["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
      猜你喜欢
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多