要派生的Javascript函数";“最小的”;数据类型?
如何在javascript中实现一个函数,该函数将字符串列表作为输入,并输出所有这些字符串都可以解析的“最小”(松散地说)类型 示例:要派生的Javascript函数";“最小的”;数据类型?,javascript,Javascript,如何在javascript中实现一个函数,该函数将字符串列表作为输入,并输出所有这些字符串都可以解析的“最小”(松散地说)类型 示例: 输入:[“真”、“假”、“假”]=>输出:“布尔” 输入:[“1”,“4”,“-9”]=>输出:“int” 输入:[“1”、“4.3”、“-9”]=>输出:“浮点”(或“双精度”,无所谓) 输入:[“9/1/2016”,“2016-9-1”]=>输出:“日期时间” 输入:[“1”、“4.3”、“9/1/2016”、“Nastassja Kinski”]=>输出
- 输入:[“真”、“假”、“假”]=>输出:“布尔”
- 输入:[“1”,“4”,“-9”]=>输出:“int”
- 输入:[“1”、“4.3”、“-9”]=>输出:“浮点”(或“双精度”,无所谓)
- 输入:[“9/1/2016”,“2016-9-1”]=>输出:“日期时间”
- 输入:[“1”、“4.3”、“9/1/2016”、“Nastassja Kinski”]=>输出:“字符串”
- 可以将所有其他内容(函数、对象、数组)标记为“字符串”
- 即使不存在时间组件,也可以将任何与日期相关的内容标记为“DateTime”
- 它需要区分int和float(这就是为什么我的输出是字符串而不是Number等本机类型)
- 它不需要完美;只是一些大致可行的东西(至少我可以根据需要进行改进)
- 每个输入数组将有100个元素
非常感谢 以声明的方式思考,如果您考虑以下标准,这很容易:
function getType(arr) {
if (arr.every(s => s === 'true' || s === 'false'))
return 'boolean'
else if (arr.every(s => isNaN(Number(s)) === false)) {
if (arr.every(n => Number(n) % 1 === 0)) return 'int'
else return 'float'
}
else if (arr.every(s => isNaN(Date.parse(s)) === false))
return 'DateTime'
else return 'string'
}
使用您的输入进行测试:
> getType(["true", "false", "false"])
'boolean'
> getType(["1","4","-9"])
'int'
> getType(["1","4.3","-9"])
'float'
> getType(["9/1/2016", "2016-9-1"])
'DateTime'
> getType(["1", "4.3", "9/1/2016", "Nastassja Kinski"])
'string'
当人们试图思考产生结果的代码时,困难就出现了;相反,如果您考虑的是您想要什么,而不是如何编写代码,那么需求将变得更加明确,解决方案也将变得更加明显
这里要学习的另一件事是,我们如何让javascript(或选择的语言,如果它不同的话)为我们做尽可能多的工作。使用清晰的谓词语法和内置函数(isNaN
和内置的Date
对象),只需8行代码就可以理解了
有人评论了不同实现的日期格式,这是一个很好的观点。虽然所有主要的实现都将支持通用的日期格式,但如果我们发现我们的日期格式更奇特,那么我们只需编写自己的日期验证器并将其插入即可。无论哪种方式,方法都是一样的:
...
else if (arr.every(s => myCustomDateValidator(s)))
return 'DateTime'
...
这里的目标是什么?为什么您需要知道类型?所以不是我们为您编写代码的地方。问一些具体的问题,让我们看看你到目前为止都做了些什么。`Output:'DateTime'。`Hoo,小子。祝你玩得开心。这很容易成为一个完整的项目。是什么让一种类型比另一种类型“小”呢?哪个更小,
int
或DateTime
?@zalogg谷歌“XY问题”太棒了,我喜欢它,我对javascript非常陌生,所以我甚至不知道javascript与.NET的Linq查询(我喜欢)大致相似。谢谢!感谢对日期验证程序的额外工作;很好的答案,完全符合我的要求。