ES6 查找js数组中是否包含某个key-value,可在任意嵌套层数中查找

实现深度优先搜索查找嵌套数据中的键值对很实用。
下面是直接能用的代码,省略废话。

javascript function deepFind(data, key, value) { if (Array.isArray(data)) { for (const item of data) { if (search(item, key, value)) return true; } return false; } if (data && typeof data === 'object') { if (data[key] === value) return true; if (data.children && Array.isArray(data.children)) { return search(data.children, key, value); } } return false; }
function search(data, key, value) { if (Array.isArray(data)) { for (const item of data) { if (deepFind(item, key, value)) return true; } return false; } if (data && typeof data === 'object') { if (data.hasOwnProperty(key) && data[key] === value) return true; if (data.children && Array.isArray(data.children)) { return deepFind(data.children, key, value); } } return false; }
例子: javascript const data = [ { id: 1 , component: "layouts/BasicLayout", children: [ { id: 2 , component: "layouts/RouteView", children: [ { id: 3 , component: "pages/Home" } ]} ]}, { id: 4 , component: "layouts/UserLayout" } ]; console.log(deepFind(data, "component", "layouts/RouteView")); // true
不确定children属性命名是否固定。
你自己掂量。

js 怎样用includes判断数组是否包含某元素

说实话,我当年第一次用includes()的时候,觉得挺有意思的。
记得有次在项目里写个筛选功能,需要判断用户输入的值是否在备选中,用includes()一行代码搞定,比以前用indexOf()再自己判断-1 的情况省事多了。

不过用多了也就发现些坑。
比如有一次遇到个bug,就是数组里有NaN,用indexOf()根本检测不到,后来换成includes()才发现它能正确处理NaN。
这个细节当时把我坑了好一阵,直接把问题归咎于自己没注意到NaN !== NaN这个特性。

fromIndex参数也是个坎儿。
有次写个懒加载组件,想从当前滚动位置往后找元素,直接把fromIndex设为负数,结果发现它不是从数组前面倒着找,而是从array.length + fromIndex开始搜。
当时我就懵了,以为是浏览器bug,后来查ES规范才知道是这么设计的。
说实话,这个用法的确有点反直觉。

稀疏数组那个更离谱。
有回用includes()检查一个用户上传的旧数据,结果发现数组里好多空槽,居然都被当成undefined给匹配上了。
这直接导致筛选逻辑乱套,最后只能手动遍历修复。
当时真是欲哭无泪,感觉这语言设计得有点不靠谱。

兼容性这块我也踩过坑。
有次给老项目加新功能,顺手用了includes(),结果测试发现IE浏览器直接崩溃。
当时真是头大,最后只能改回indexOf(),还得加个Babel转译。
这让我明白,写代码不能光看新特性,得考虑生态。

总的来说,includes()是个挺好用的方法,特别是处理NaN和自定义比较的时候。
但用之前得清楚它的行为边界,比如类型严格匹配、fromIndex的骚操作、稀疏数组的诡异表现。
这些细节不搞明白,很容易写出看似正确实则有bug的代码。
这块我算是吃透了,至少现在写相关功能不会再出错了。

基础 js判断数组包含某个元素的方法有多少?一般可以用这些语法

对,就是这个问题。
indexOf()简单,直接用。

想快速?用some(),别用find(),除非找特定位置。

数组太大?用filter(),然后判断结果长度。

记得,NaN是个麻烦,别用some()。

ES6 新方法好,但别忘老方法。
灵活用,效率高。
你自己看。