持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第31天,点击查看活动详情
目录
今日题
题目
实现一个数组的find
方法
分析
Array.prototype._find = function() {}
昨日题
题目
// 生成一个用户对象格式验证器
const verifyUserType = new VerifyType({
name: String,
age: Number,
sex: String,
account: String,
friends: [{
name: String,
account: String,
addTime: Number
}]
})
// 测试用户
const user = {
name: "张三",
age: 18,
sex: "男",
account: "111222333",
friends: [{
name: "李四",
account: "222333444",
addTime: 12345678900
}, {
name: "王五",
account: "333444555",
addTime: 98765432100
}]
}
// 调用verify方法查看是否通过
verifyUserType.verify(user) // true
答案
无固定答案,下面仅展示部分写法:
class VerifyType {
constructor(check) { this.check = check }
isEqual = (data, Type) => data.constructor === Type
isBaseData = data => ['string', 'number'].includes(typeof data)
isArrayType = data => Object.prototype.toString.call(data).slice(8, -1) === 'Array'
verify(user, check = this.check) {
const userArr = Object.keys(user)
for (let i = 0, len = userArr.length; i < len; i++) {
const key = userArr[i]
const base = this.isBaseData(user[key])
if (base) {
if (this.isEqual(user[key], check[key])) continue
return false
}
const array = this.isArrayType(user[key])
if (array) {
for (let j = 0, len2 = user[key].length; j < len2; j++)
if (!this.verify(user[key][j], check[key][0])) return false
continue
}
if (!this.verify(user[key], check[key])) return false
}
return true
}
}
解析
您可以通过constructor
或原型链
来完成类型判断,不过在使用原型链时需要注意引用类型之间的关系,不要盲目的去做判断,而constructor
正是利用了构造函数这一特性(ps:构造函数在继承时需要注意constructor的指向,必要时应对其修改)。本题目中当格式符合时,使用continue
进行下一次循环,当格式不符合时,直接终止并返回false
;格式分为基础数据类型
和引用数据类型
,当为后者时进行递归调用
为了避免过于复杂,此写法仅考虑题目中所给出的示例,不进行额外扩展
结语
此文章已收录至《JavaScript每日一题》专栏,如果你对本专栏有任何建议,欢迎反馈。如果你对此文章中的题目还有不懂的地方,那么请在评论区留言与大家一起讨论吧。 创作不易,少年,就请留个赞再走吧!