Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何降低此javascript时间戳生成器函数的复杂性/嵌套ifs_Javascript_Nested - Fatal编程技术网

如何降低此javascript时间戳生成器函数的复杂性/嵌套ifs

如何降低此javascript时间戳生成器函数的复杂性/嵌套ifs,javascript,nested,Javascript,Nested,您好,我有一个我制作的函数,该函数旨在根据我调用的API构建部分ISO时间戳,它应该返回的时间戳示例如下: 2017Z 2017-12Z 2017-12-24Z 2017-12-24T14Z 2017-12-24T14:07Z 我用于执行此操作的代码如下所示: function parsePartialDateTime(datetime = {}) { if (datetime === null || datetime.year === undefined) { return nu

您好,我有一个我制作的函数,该函数旨在根据我调用的API构建部分ISO时间戳,它应该返回的时间戳示例如下:

2017Z
2017-12Z
2017-12-24Z
2017-12-24T14Z
2017-12-24T14:07Z
我用于执行此操作的代码如下所示:

function parsePartialDateTime(datetime = {}) {
  if (datetime === null || datetime.year === undefined) {
    return null;
  }

  let dateString = `${datetime.year}`;

  if (datetime.month) {
    dateString += `-${datetime.month}`;
    if (datetime.day) {
      dateString += `-${datetime.day}`;
      if (datetime.hour) {
        dateString += `T${datetime.hour}`;
        if (datetime.minute) {
          dateString += `:${datetime.minute}`;
          if (datetime.second) {
            dateString += `:${datetime.second}`;
          }
        }
      }
    }
  }

  return `${dateString}Z`;
}
我真的不知道如何才能消除嵌套if函数的需要,因为如果前面的项存在(它们都在datetime对象中作为字符串/数字提供),它应该只构建时间戳的每个元素


如果您对此有任何帮助,我们将不胜感激:)

您可以将这些值放入一个数组中并在其上循环:

// Just for brevity in this example
var dt = datetime;
// Put all the units you want checked in this array
var units = [dt.month, dt.day, dt.hour, dt.minute, dt.second];

var dateString = dt.year
// Then loop over the array... 
for (let unit of units) {
    //... checking and adding like you were before
    if (unit) {
        dateString += `-${unit}`;
    } else {
        // So the rest of the object gets ignored
        break;
    }  
}
不过,如注释中所述,这对每个
单元使用相同的分隔符。它增加了少量复杂性来解决此问题:

// Each unit is paired with the delimiter that should be used on its left
var units = [[dt.month, "-"], [dt.day, "-"], [dt.hour, "T"],
             [dt.minute, ":"], [dt.second, ":"]];

var dateString = dt.year
// Deconstruct out the unit and the delimiter
for (let [unit, delim] of units) {
    if (unit) {
        dateString += delim + `${unit}`;
    } else {
        break;
    } 
} 

由于代码中的每个分支基本上都采用了
if(x)y+=x
的形式,因此可以相当容易地提取出来。如果你一次又一次地做着几乎相同的事情,试着做一个循环

不同的时间分隔符components@charlietfl哦,你说得对。我错过了。我会上我的笔记本电脑把它修好。这不是他所需要的,因为如果有一个片段丢失,它应该停止构建
日期字符串。如果缺少dt.month但仍有dt.minute,则此代码将继续构建字符串。如果您添加了
else break
如果缺少什么东西就结束for循环?@SteveFrancisco我不应该在醒来后一分钟内回答这个问题:/。是的,休息一下应该可以解决这个问题。感谢您注意到这一点。@Carcigenicate我不得不稍微修改它,使其符合ES6和Linting规则,但它降低了复杂性,标记为“答案”,因为它解决了我遇到的问题:)为什么首先需要嵌套这些内容?如果代码有效,最好在上面询问,但最好在它们的。。。