如何使这个程序性JS更加实用

How could this procedural JS be made more functional?

本文关键字:JS 何使这 程序性      更新时间:2023-09-26

给定这个基于用户设置重新排序数组的函数。。。

function getDayNamesInUserOrder() {
    var dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
    var weekStartDayIndex = 2; // user has set this to be 2 (Tuesday)
    // remove the first n days from the front of the array...
    var daysSlicedFromStart = dayNames.splice(0, weekStartDayIndex);
    // and stick them onto the end of it.
    var dayNamesInUserOrder = dayNames.concat(daysSlicedFromStart);
    return dayNamesInUserOrder;
}
getDayNamesInUserOrder();
=> ['Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'Mon']

如何在使用更少的状态和变量的同时使其更具功能性?

这个怎么样?

function getDayNamesInUserOrder(offset) {
  var dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
  return [0,1,2,3,4,5,6].map(function (i) {
    return dayNames[(i+offset) % 7];
  });
}

您可以这样做:

function getDayNamesInUserOrder(startIndex) {
    var dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
    var result = [];
    for (var i = 0; i < dayNames.length; i++) {
        result.push(dayNames[(startIndex + i) % dayNames.length]);
    }
    return result;
}

演示:http://jsfiddle.net/jfriend00/ddhagb33/


仅供参考,似乎很难找到"函数式编程"的清晰定义。我能找到的是:

  1. 数据应该是不可变的——如果你想要一个修改过的数据版本,你可以创建一个新的修改过的副本
  2. 函数应该是无状态的(没有影响将来调用同一函数的副作用)

这个函数同时满足这两个条件(就像你原来的函数一样)。如果你有一个更具体的愿望"更实用",那么请准确地描述你想要什么。

function getDayNamesInUserOrder() {
  var dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
  var weekStartDayIndex = 2; // user has set this to be 2 (Tuesday)
  return dayNames.concat(dayNames).slice(weekStartDayIndex, weekStartDayIndex + 7);
}