zoukankan      html  css  js  c++  java
  • 在javascript对象内搜索,貌似是一个新鲜的话题。

     为啥

      也不为啥,因为没找到。

    用途

      也没啥用途,比如,在电影网站找到链接,在小说网站找到链接。二货同事写的复杂对象。等等吧。反正要搜索就对了。

    目标

      在对象内,无论多少层,找到关键字。

    关键字可能的位置

      1.属性名,2.属性值,3.方法名,4.方法内。

    一个简单的办法

      把对象转成json,搜索字符串,对于不需要处理方法的前提下,非常方便,甚至可以用正则表达式去处理,然而,搜索到的结果只是定位,要还原出路径就难了。

    另一个简单的办法

      遍历对象,很直接,一个递归搜到底,就一个坑,循环嵌套对象要怎么处理。

    爬坑

      给每个见过的对象做一个标记,见到标记就不再看内部了。要是标记的对象里包含目标字符串,可以保存一个对象路径,要是只关心值,就可以不保存了。

    聊着聊着,问题就分析明白了。做一个非常唯一的标记很重要,还要记得删除这个标记,好反复搜索。

    var findInObject = {
        fio_MARKED: 1,
        CustomObjects: [],
        marked: [],
        searchResult: [],
        defaultname: ['frames', 'self', 'window', 'parent', 'top', 'location', 'content', 'document', 'history', 'locationbar', 'menubar', 'personalbar', 'scrollbars', 'statusbar', 'toolbar', 'navigator', 'applicationCache', 'customElements', 'screen', 'clientInformation', 'styleMedia', 'performance', 'caches', 'crypto', 'indexedDB', 'webkitStorageInfo', 'sessionStorage', 'localStorage', 'visualViewport', 'speechSynthesis', 'chrome', 'external', 'qb_external', 'qb_minivideo', 'qbmv', 'userObjects', 'defaultStatus', 'll', 'lll', 'gnp', 'vm'],
        fio(obj, str, path, flag) {
    
            if (!path) path = 'window'
            if (!flag) flag = 'fioflg_' + Date.parse(new Date())
            const otype = typeof obj
            if (otype == 'string') {
                if (obj.indexOf(str) > -1) {
                    this.searchResult.push({ path: path, type: "值命中", value: obj })
                }
            } else if (typeof obj == 'function') {
                var strfunc = obj.toString()
                if (strfunc.indexOf(str) > -1) {
                    this.searchResult.push({ path: path, type: '方法内命中', value: strfunc })
                }
            } else if (typeof obj == 'number') {} else if (typeof obj == 'bigint') {} else if (typeof obj == 'boolean') {} else if (typeof obj == 'symbol') {} else if (Array.isArray(obj)) {
                if (this.isMarked(obj, flag) == false) {
                    for (const key in obj) {
                        if (obj.hasOwnProperty(key)) {
                            const element = obj[key];
                            this.fio(element, str, path + '[' + key + ']', flag)
                        }
                    }
                }
            } else if (obj instanceof Object) {
                if (this.isMarked(obj, flag) == false) {
                    if (obj[str] != undefined) {
                        this.searchResult.push({ path: path + '/' + str, type: '属性命中', value: obj[str] })
                    }
                    for (const key in obj) {
                        if (this.defaultname.indexOf(key) == -1) {
                            if (obj.hasOwnProperty(key)) {
                                try {
                                    var element = obj[key]
                                } catch (error) {
                                    var element = {}
                                }
    
                                if (path == 'window') {
                                    var ty = typeof element
                                    if (['function', 'number', 'bigint', 'boolean', 'symbol', 'string'].indexOf(ty) == -1 && Array.isArray(element) == false && element instanceof Object) {
                                        this['CustomObjects'][key] = element
                                    }
                                }
                                this.fio(element, str, path + '.' + key, flag)
                            }
                        }
                    }
                }
            }
        },
        isMarked(obj, flag) {
            if (obj.fio_MARKED) {
                return true
            } else {
                obj.fio_MARKED = flag
                this.marked.push(obj)
                return false
            }
        },
        search(str) {
            this.fio(window, str)
            this.marked.forEach(item => {
                delete item['fio_MARKED']
            });
            this.marked = []
            console.log(this)
        },
    }

    没处理命中标记,其他的还都ok

      

  • 相关阅读:
    Docker集群管理之Swarm介绍
    【响应式编程的思维艺术】 (1)Rxjs专题学习计划
    【Angular专题】 (3)装饰器decorator,一块语法糖
    angularjs1.X进阶笔记(3)——如何重构controller
    【Angular专题】——(2)【译】Angular中的ForwardRef
    【Angular专题】——(1)Angular,孤傲的变革者
    00067_字符串类中涉及正则表达式的常用方法
    Web编辑器 图片粘贴上传,实现图文粘贴,图片自动上传
    wangEditor 图片粘贴上传,实现图文粘贴,图片自动上传
    批量下载文件示例
  • 原文地址:https://www.cnblogs.com/allofalan/p/11338307.html
Copyright © 2011-2022 走看看