如何降低此javascript时间戳生成器函数的复杂性/嵌套ifs
您好,我有一个我制作的函数,该函数旨在根据我调用的API构建部分ISO时间戳,它应该返回的时间戳示例如下:如何降低此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
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规则,但它降低了复杂性,标记为“答案”,因为它解决了我遇到的问题:)为什么首先需要嵌套这些内容?如果代码有效,最好在上面询问,但最好在它们的。。。