实现数组的find方法

166 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第31天,点击查看活动详情

目录

今日题

  1. 题目
  2. 分析 昨日题
  3. 题目
  4. 答案
  5. 解析 结语

今日题

题目

实现一个数组的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每日一题》专栏,如果你对本专栏有任何建议,欢迎反馈。如果你对此文章中的题目还有不懂的地方,那么请在评论区留言与大家一起讨论吧。 创作不易,少年,就请留个赞再走吧!