【问题标题】:Javascript function to derive "smallest" data type? [closed]导出“最小”数据类型的Javascript函数? [关闭]
【发布时间】:2017-01-09 19:23:42
【问题描述】:

我如何在 javascript 中实现一个函数,该函数将字符串列表作为输入,并输出所有这些字符串都可以解析为的“最小”(松散地说)类型?

例子:

  • 输入:["true", "false", "false"] => 输出:"boolean"。

  • 输入:[“1”,“4”,“-9”] => 输出:“int”。

  • 输入:[“1”,“4.3”,“-9”] => 输出:“float”(或“double”,无所谓)。

  • 输入:["9/1/2016", "2016-9-1"] => 输出:"DateTime"。

  • 输入:[“1”,“4.3”,“9/1/2016”,“Nastassja Kinski”] => 输出:“字符串”。

备注:

  • 可以将其他所有内容(函数、对象、数组)标记为“字符串”。
  • 即使不存在时间组件,也可以将任何与日期相关的内容标记为“DateTime”。
  • 它需要区分 int 和 float(这就是为什么我的输出是字符串而不是原生类型,例如 Number)。
  • 不需要完美;只是大致有效的东西(如果需要,我可以改进)。
  • 输入数组每个包含 100 个元素。

非常感谢!

【问题讨论】:

  • 这里的目标是什么?为什么需要知道类型?
  • SO 不是我们为您编写代码的地方。提出具体问题并向我们展示您迄今为止的尝试。
  • ` 输出:“日期时间”。` 哦,男孩。玩得开心。这很容易成为一个完整的项目。
  • 是什么让一种类型比另一种“更小”? intDateTime 哪个更小?
  • @zalofg Google“XY 问题”

标签: javascript


【解决方案1】:

以声明的方式考虑它,如果您考虑标准,这很容易:

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'
...

【讨论】:

  • 太棒了,我喜欢它,我对 javascript 很陌生,所以我什至不知道 javascript 有一些与 .NET 的 Linq 查询(我喜欢)大致相似的东西。非常感谢!
  • 感谢日期验证器的额外工作;总体上很好的答案,正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 2012-06-29
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
相关资源
最近更新 更多