在任意深度的嵌套数组中查找值

时间:2018-08-02 23:07:13

标签: javascript ecmascript-6 logic

当前正在重构一些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,则函数继续在数组中向下;如果没有出现错误返回的情况,则该函数返回true。

2 个答案:

答案 0 :(得分:0)

这是一个在结构上运行depth-first search的迭代(非堆栈溢出)解决方案。请注意,我使用set进行快速查找:

,

答案 1 :(得分:0)

作为@ggorlen的替代方法,但是使用递归方法,它将看起来像这样:

let hitPossibilities = ["CASE1", "CASE2"];
let target =
    [
        "cat",
        "dog",
        [
            "CASE1",
            [
                "dad",
                "CASE2"
            ],
            "mom"
        ],
        "pam"
    ]

function search(target, hit) {
  for (let i = 0; i < target.length; ++i) {
    currTarget = target[i];

    if(Array.isArray(currTarget)) {
       if(!search(currTarget, hit)){
         return false;
       }
    } else {
      for(let j = 0; j < hit.length; ++j) {
        let currHit = hit[j];

        if(currTarget === currHit) {
          if(!isValid()) {
            return false;
          }
        }
      }
    }
  }
  return true;
}

// Your function here...
function isValid() {
  return true; // put false to test the differet output.
}

console.log(search(target, hitPossibilities));