javascript - 在任意深度的嵌套数组中查找值
问题描述
目前正在重构一些javascript(ES6)逻辑,我遇到了一个场景,我需要搜索任意深度的嵌套数组以查找某些元素,使用辅助函数进行检查,并根据辅助函数的结果设置一个布尔值。
let hit_possibilities = ["CASE1", "CASE2"];
let target =
[
"cat",
"dog",
[
"CASE1",
[
"dad",
"CASE2"
],
"mom"
],
"pam"
]
上述变量代表上述两个数组。
我需要一个函数,它同时接收一个目标数组(可以是任何深度和任何对象顺序)和一个 hit_possibilities 数组来检查 hit_possibilities 中的任何元素是否存在于目标数组中。如果该函数命中了 hit_possibilities 中的元素,它会调用另一个返回 true 或 false 的函数(内容不相关,只是一个已经编写好的帮助器)。如果返回 false,则函数立即中断,返回 false。如果返回 true,则函数继续沿数组向下;如果没有返回 false 的情况,则函数返回 true。
解决方案
这是一个在结构上运行深度优先搜索的迭代(非堆栈溢出)解决方案。请注意,我使用了一组进行快速查找:
let hitPossibilities = ["CASE1", "CASE2"];
let target = [
"cat",
"dog",
[
"CASE1",
[
"dad",
"CASE2"
],
"mom"
],
"pam"
];
const helper = e => false; // stub
const search = (needles, haystack) => {
const set = new Set(needles);
const stack = [haystack];
while (stack.length) {
const curr = stack.pop();
for (let i = 0; i < curr.length; i++) {
if (Array.isArray(curr[i])) {
stack.push(curr[i]);
}
else if (set.has(curr[i]) && !helper(curr[i])) {
return false;
}
}
}
return true;
};
console.log(search(hitPossibilities, target));
console.log(search(["FOO", "BAR"], target));
推荐阅读
- laravel - Livewire 会话在 Laravel Auth 中间件中返回 NULL
- python - 如何从字符串格式的日期时间对象中找到最近的时间
- java - 如何在java中的字符串(6678766566)中重复精确的双六计数?
- scala - 特征混合中的 Scaldi 注射器
- javascript - 使用组合键值将 JSON 数组简化为对象
- python - Tensorflow 训练由 SIGSEGV 随机终止
- reactjs - 在 jspdf 中显示 firebase 图像
- mysql - 我想将数组数据从表格形式插入到laravel中的数据库
- python - 如何将自定义数据类列表编码为 JSON
- python - Azure 持久功能 500 502 504 错误