在javascript对象内搜索,貌似是一个新鲜的话题…
2019-08-14 10:32:26来源:博客园 阅读 ()
为啥
也不为啥,因为没找到。
用途
也没啥用途,比如,在电影网站找到链接,在小说网站找到链接。二货同事写的复杂对象。等等吧。反正要搜索就对了。
目标
在对象内,无论多少层,找到关键字。
关键字可能的位置
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
原文链接:https://www.cnblogs.com/allofalan/p/11338307.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:js数组与对象的区别
下一篇:掷骰子
- javascript面向对象入门基础详细介绍 2020-03-29
- JavaScript函数表达式详解及实例 2020-03-25
- 如何用javascript连接access数据库 2020-03-20
- js中去掉字串左右空格 2020-03-20
- Javascript中的经典技巧 2020-03-20
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash