为啥

  也不为啥,因为没找到。

用途

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

目标

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

关键字可能的位置

  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

  

在javascript对象内搜索,貌似是一个新鲜的话题。的更多相关文章

  1. JavaScript对象类型之简单介绍

    引言 对象是JavaScript的基本数据类型. 对象是一种复合值:将很多值(原始值或者其他对象)聚合在一起,通过名字访问这些值. 对象可以看做属性的无序集合,每个属性都是一个名/值对.属性名是字符串 ...

  2. JavaScript对象的两类属性(数据属性与访问器属性)

    对JavaScript来说,属性并非只是简单的名称和值,JavaScript用一组特征(attribute)来描述属性 (property). 第一类属性数据属性具有四个特征. value:就是属性的 ...

  3. 明明有印象却找不到,APP内搜索为什么这么难用?

    赶上了互联网浪潮的当代人,每当有任何困扰,第一反应都是打开搜索引擎. 什么叫做“硬核相亲”,什么是“pick一下”,“达达主义”,“隐形贫困人口”——你都默默搜索过,不想被时代与话题抛弃.也许只有这样 ...

  4. javascript常用内置对象总结(重要)

    Javascript对象总结 JS中内置了17个对象,常用的是Array对象.Date对象.正则表达式对象.string对象.Global对象 Array对象中常用方法: Concat():表示把几个 ...

  5. JavaScript中内置对象的一些属性及方法

    Javascript对象总结 JS中内置了17个对象,常用的是Array对象.Date对象.正则表达式对象.string对象.Global对象 Array对象中常用方法: Concat():表示把几个 ...

  6. 【JavaScript】内置对象Math

    Math是具有用于数学常数和函数的属性和方法一内置对象.不是函数对象. 描述编辑 不像其他的全局对象,Math不是一个构造函数.所有属性和方法Math都是静态的.你指的是常数pi为Math.PI你调用 ...

  7. 微信浏览器内置JavaScript 对象:WeixinJSBridge

    微信公众平台开发 微信公众平台开发模式 企业微信公众平台 微信浏览器 分享到朋友圈 发送给好友 分享到腾讯微博 作者:方倍工作室 原文: http://www.cnblogs.com/txw1958/ ...

  8. WeixinJSBridge:微信浏览器内置JavaScript 对象

    微信公众平台开始支持前端网页,大家可能看到很多网页上都有分享到朋友圈,关注微信等按钮,点击它们都会弹出一个窗口让你分享和关注,这个是怎么实现的呢?今天就给大家讲解下如何在微信公众平台前端网页上添加分享 ...

  9. JavaScript常用内置对象(window、document、form对象)

    由于刚开始学习B/S编程,下面对各种脚本语言有一个宏观的简单认识. 脚本语言(JavaScript,Vbscript,JScript等)介于HTML和C,C++,Java,C#等编程语言之间.它的优势 ...

随机推荐

  1. php判断两个数组是否相等

    php判断两个数组是否相等 一.总结 一句话总结: php判断两个数组是否相等可以直接上==或者===号 二.php 判断两个数组是否相等 转自或参考:php 判断两个数组是否相等https://ww ...

  2. Qt configure 参数

    在编译QT前,可加各种参数来定制自己想要的QT库.这对需要裁减QT库的朋友来说非常重要.对于如何编译QT,可以参考:http://hi.baidu.com/agassi%5Fp/blog/item/4 ...

  3. mysql端口3306无法访问

    mysql主备复制,show slave status显示IO一直connecting 一.查看了防火墙,已经处于关闭状态 二.查看使用的复制用户的权限,也已经开放 三.telnet访问另外一台机器端 ...

  4. VUE数组操作方法的局限

    1.不能通过索引值直接设置一个项: vm.items[indexOfItem] = newValue 但是可以用set方法设置: Vue.set(example1.items,indexOfItem, ...

  5. 小记LoadRunner 11 安装VC2005运行环境报错处理

    这几天在做性能优化,需要在虚拟机里装个LoadRunner 11.从测试同学那里搞来安装包,按照文档提示安装系统运行环境,提示我要装VC2005 SP1. 安装程序自己安装,报错.截图如下. 于是我又 ...

  6. JDK1.8新特性之Optional

    概念 Optional 是JDK1.8中出现的一个容器类,代表一个值存在或者不存在.原来使用null表示一个值不存在,现在Optional可以更好的表达这个概念.并且可以避免空指针异常. 场景分析 需 ...

  7. 集群架构03·MySQL初识,mysql8.0环境安装,mysql多实例

    官方网址 https://dev.mysql.com/downloads/mysql/社区版本分析 MySQL5.5:默认存储引擎改为InnoDB,提高性能和可扩展性,增加半同步复制 MySQL5.6 ...

  8. 牛客竞赛(gcd,快速幂)

    一.最大公约数和最小公倍数问题 题目描述: 输入2个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数. 条件:1.P, ...

  9. std::replace函数

    需包含头文件#include <algorithm> template <class ForwardIterator, class T> void replace (Forwa ...

  10. 字符编码笔记:ASCII,Unicode 和 UTF-8(理解)

    1.ASCII 码 美国制定的字符编码规则,对英语字符与二进制位之间的关系做了统一规定. 占一个字节,8 位,最多可表示 2^8 = 256 种状态(字符) 实际共有 128 个字符,只占用一个字节的 ...