Javascript函数派生出最小的"数据类型?

时间:2016-09-01 19:29:45

标签: javascript

我怎样才能在javascript中实现一个函数,它将一个字符串列表作为输入,并输出"最小的" (松散地说)可以解析所有这些字符串的类型吗?

示例:

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

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

  • 输入:[" 1"," 4.3"," -9"] =>输出:"浮动" (或" double",无所谓)。

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

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

说明:

  • 可以将其他所有内容(函数,对象,数组)标记为" string"。
  • 即使没有时间组件,也可以将与日期相关的任何内容标记为" DateTime&#34 ;.
  • 它需要区分int和float(这就是为什么我的输出是字符串而不是像Number这样的本机类型)。
  • 它不需要完美;只是大致有效的东西(我可以根据需要进行改进)。
  • 输入数组各有100个元素。

非常感谢!

1 个答案:

答案 0 :(得分: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'
...