首页 > 解决方案 > 在任意深度的嵌套数组中查找值

问题描述

目前正在重构一些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。

标签: javascriptecmascript-6logic

解决方案


这是一个在结构上运行深度优先搜索的迭代(非堆栈溢出)解决方案。请注意,我使用了一进行快速查找:

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));


推荐阅读