Open lyh2668 opened 6 years ago
设计一个生成mock对象的方法 输入为一种mock语法 mock语法长这样
{ 'data.user.name': String, 'data.user.age': Number, 'data.isShow': Boolean }
一条mock规则分为两部分,字段名和数据类型,字段名可嵌套,数据类型支持String、Number、Boolean即可 输出为mock对象,按照mock规则随机生成对象
String
Number
Boolean
{ data: { user: { name: 'asdfghjkl', age: 20 }, isShow: true } }
.
Object.assign
typeof type.prototype.valueOf
const obj = { 'data.user.name': String, 'data.user.age': Number, 'data.isShow': Boolean } let mock = (obj) => { let mockObj = {} for (let key in obj) { let keys = key.split('.') mockData(mockObj, keys, obj[key]) } return mockObj } let mockData = (mockObj, arr, type) => { let key = arr[0] let tmpObj = {} if (arr.length === 1) { if (typeof type.prototype.valueOf() === 'string') { // string, number, boolean // 根据类型随机生成数据 } // 这里先用123模拟 tmpObj[key] = '123' mockObj = Object.assign(mockObj, tmpObj) return mockObj } if (!(key in mockObj)) { mockObj[key] = {} } tmpObj[key] = mockData(mockObj[key], arr.slice(1, arr.length), type) mockObj[key] = Object.assign(mockObj[key], tmpObj[key]) return mockObj } mock(obj)
这题本身思路并不难,难度在于递归和对象的合并,但是这道题目花费了我挺长时间的,需要注意的是几个坑点:
给定一个时间段和步长,枚举该时间段内步长的划分 例如:时间段6:00-9:00,步长为45分钟 那么返回的数组为 ['6:00-6:45', '6:45-7:30', '7:30-8:15', '8:15-9:00']
['6:00-6:45', '6:45-7:30', '7:30-8:15', '8:15-9:00']
这题相对第一题简单的多,略微思考一下就有解题思路了
let time2min = (time) => { let arr = time.split(':') return arr[0] * 60 + parseInt(arr[1]) }
let min2time = (min) => { let hour = parseInt(min / 60) let minute = min - hour * 60 if (hour >= 24) { hour = hour - 24 } if (minute < 10) { minute = '0' + minute } if (hour < 10) { hour = '0' + hour } return ${hour}:${minute} }
${hour}:${minute}
let calStep = (start, end, step) => { let startTime = time2min(start) let endTime = time2min(end) if (startTime > endTime) { endTime += 24 * 60 } let arr = [] while (startTime < endTime) { let right = startTime + step > endTime ? endTime : startTime + step arr.push(${min2time(startTime)}-${min2time(right)}) startTime += step } return arr }
${min2time(startTime)}-${min2time(right)}
calStep('22:10', '0:30', 35)
## 总结 这题由于讲究一个速度,所以没有太多的考虑,从理思路到编写大概用了20分钟时间,所以可能有些写法上还不够严谨。 这题从看到题目的开始我就注意到了可以用转化成分钟来做,然后注意到了可能会有跨天的情况,这个应该算是这道题目的应该坑点吧。
题目一、生成Mock数据
设计一个生成mock对象的方法
输入为一种mock语法
mock语法长这样
一条mock规则分为两部分,字段名和数据类型,字段名可嵌套,数据类型支持
String
、Number
、Boolean
即可输出为mock对象,按照mock规则随机生成对象
解题思路
.
拆分为数组,然后通过递归数组的方式完成对象的生成Object.assign
进行合并typeof type.prototype.valueOf
的方式判断类型,随机数据可以先预设一个规则(简单略过)代码实现
总结
这题本身思路并不难,难度在于递归和对象的合并,但是这道题目花费了我挺长时间的,需要注意的是几个坑点:
题目二、时间分段
给定一个时间段和步长,枚举该时间段内步长的划分
例如:时间段6:00-9:00,步长为45分钟
那么返回的数组为
['6:00-6:45', '6:45-7:30', '7:30-8:15', '8:15-9:00']
解题思路
这题相对第一题简单的多,略微思考一下就有解题思路了
代码实现
let min2time = (min) => { let hour = parseInt(min / 60) let minute = min - hour * 60 if (hour >= 24) { hour = hour - 24 } if (minute < 10) { minute = '0' + minute } if (hour < 10) { hour = '0' + hour } return
${hour}:${minute}
}let calStep = (start, end, step) => { let startTime = time2min(start) let endTime = time2min(end) if (startTime > endTime) { endTime += 24 * 60 } let arr = [] while (startTime < endTime) { let right = startTime + step > endTime ? endTime : startTime + step arr.push(
${min2time(startTime)}-${min2time(right)}
) startTime += step } return arr }calStep('22:10', '0:30', 35)