JavaScript的ES6语法综合使用操作

JavaScript的ES6语法综合使用操作

设计一个JavaScript函数,使用ES6语法,完成阿拉伯数字与罗马数字的相互转化

// TODO: create a RomanNumerals helper object
let RomanNumerals = {
    // 计算百、十、个位数字对应罗马数字的累加
    tool: (child, a, b, c, d) => {
        let sum = '',
            k = 0
        sum = child / 5 >= 1 ? a : ''
        let son = child >= 5 ? child - 5 : child
        while (k < Number(son)) {
            sum += b
            k++
        }
        if (Number(son) === 4) {
            return Number(son) !== Number(child) ? b + c : b + a
        }
        return sum
    },
    // 转化为阿拉伯数字 (使用function防止this找不到作用域)
    toRoman: function (num) {
    	// 倒置操作为后面做铺垫
        let reStr = [...`${num}`].reverse().join(''),
            arr = []
        // 补零操作
        while (reStr.length < 4) {
            reStr += '0'
        }
       	// 转化为二维数组区分百、十、个位与千位,并做出还原倒置操作
        arr = [[...reStr.substr(0, 3)].reverse(), [...reStr.substr(3, reStr.length - 1)].reverse().join('')].reverse()
        // 打印出入参和自定义二维数组[String, Array]
        console.log(num, arr)
        return arr.map((item, i) => {
        	// 对自定义二维数组进行处理
            if (i === 0) {
                let j = 0,
                    sum = ''
                while (j < Number(item)) {
                    sum += 'M'
                    j++
                }
                return sum
            } else {
            	// 对百、十、个位的数字进行处理
                return item.map((child, j) => {
                    if (j === 0) {
                        return this.tool(child, 'D', 'C', 'M')
                    } else if (j === 1) {
                        return this.tool(child, 'L', 'X', 'C')
                    } else {
                        return this.tool(child, 'V', 'I', 'X')
                    }
                })
            }
            // 转化完成并降维,转化为字符串
        }).flat(1).join('')
    },
    // 转化为罗马数字
    fromRoman: (roman) => {
        console.log(roman)
        return [...roman].map(item => {
        	// 将罗马数字的每一位转化为数字处理
            switch (item) {
                case 'M':
                    return 1000
                break;
                case 'D':
                    return 500
                break;
                case 'C':
                    return 100
                break;
                case 'L':
                    return 50
                break;
                case 'X':
                    return 10
                break;
                case 'V':
                    return 5
                break;
                case 'I':
                    return 1
                break;
            }
        }).reduce((total, cur, i, recent) => {
        	// 进行累增获累减操作并返回结果
            return cur < recent[i + 1] ? total - cur : total + cur
        }, 0)
    }
}
// 可进行更多测试,测试区间[1-10000],10000+暂未验证合理性
console.log(RomanNumerals.toRoman(3440))
console.log(RomanNumerals.fromRoman('IV'))

总结

  1. 为什么不使用if循环?
    JavaScript的if循环在编译完成之后依旧是while循环
  2. 为什么计算不是单纯的递增?
    罗马数字的计算规则不是单纯的字母递增,在4和9上面有一定区别。
  3. 为什么使用ES6语法?
    可运用展开运算符、链式运算和一些数组api以及三元运算符减少代码量,并在一定程度上优化性能。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BB_zhan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值