Javascript,检查当前部件对象是否在其他部件对象内

时间:2016-01-07 17:56:07

标签: javascript lodash

我试图循环一个对象并检查某个属性是否在对象的任何其他某些部分内。我试图看看第一个level.parentSearch是否在任何其他firstlevel.filters数组(对象)中。

所以我的对象看起来像这样:

    var currentfilters = [{
    "id": "topics",
    "name": "Topics",
    "filters": [{
        "id": "isSubTopic",
        "label": "isSubTopic",
        "search": "isSubTopic",
        "num": 15
    }]
}, {
    "id": "isSubTopic",
    "name": "isSubTopic",
    "parentSearch": "isSubTopic",
    "filters": [{
        "id": "subtopicFilter",
        "label": "subtopicFilter",
        "search": "subtopicFilter",
        "num": 2
    }, {
        "id": "subtopicFilter1",
        "label": "subtopicFilter1",
        "search": "subtopicFilter1",
        "num": 2
    }]
}, {
    "id": "notSubTopic",
    "name": "notSubTopic",
    "parentSearch": "uniueParentSearch",
    "filters": [{
        "id": "notSubTopic1",
        "label": "notSubTopic1",
        "search": "notSubTopic1",
        "num": 5
    }]
}
];

所以我想要实现的是循环遍历此对象并稍微修改它(如果需要)并返回它。我想要做的是检查第一级,如果.parentSearch属性在任何其他对象.filter数组中作为.search属性。所以在这个例子中isSubTopic将是我正在寻找的,因为它位于Topics过滤器数组中。

这是我第一次尝试这类问题,所以如果我遗漏了什么,请告诉我。我想,因为我想返回一个修改过的对象,最好减少这个对象并检查内部。我正在努力的部分是检查我当前的parentSearch(在reduce循环中)是否在任何其他对象过滤器数组(在.search属性下)的位。我有很多问题,所以我尝试了_.find_.has,但我认为我没有正确接近这一点。任何/所有输入将不胜感激!

以下是我尝试使用的内容:https://jsfiddle.net/0fttkyey/32/

function checkIfSubtopic(memo, value, key) {
if(value.parentSearch) {
//check if value.parentSearch is in any of the value.filters
console.log("find?", _.find(currentfilters, value.parentSearch));
if(_.find(currentfilters, value.parentSearch)){
        console.log("is subtopic?");
} else {
    console.log("not sub topic");
}
}
 return memo;

}

1 个答案:

答案 0 :(得分:1)

有趣的是,你提供的jsfiddle中的currentfilters不一样,所以没有结果。

如果我理解正确,你试图实现的是:

  1. 对于每个"过滤器"在currentfilters数组中,检查parentSearch成员是否真实。
  2. 如果是,循环通过所有其他过滤器。
  3. 对于这些过滤器中的每一个,循环通过其filters阵列成员。
  4. 如果此search数组中某个对象的filters成员等于parentSearch值,请保留当前"过滤器"。
  5. 所以你有3个嵌套循环。

    2个外部循环遍历相同的currentfilters数组,除了第2个(内部)数据跳过正在搜索parentSearch值的过滤器。

    一旦找到parentSearch值,就打破循环2和3(最内层2)并转到第1个(最外层)循环的下一个项目。

    不使用lodash并构建新的结果数组(而不是修改currentfilters数组,这可能会产生意外的结果),例如:

    var i = 0,
      j,
      ifiltermax = currentfilters.length,
      currentParentSearch,
      currentFiltersArray,
      k,
      result = [];
    
    for (; i < ifiltermax; i += 1) { // Loop 1.
      currentParentSearch = currentfilters[i].parentSearch;
      if (currentParentSearch) { // If `parentSearch` is truthy.
        loop_j: for (j = 0; j < ifiltermax; j += 1) { // Loop 2.
          if (j != i) { // Skip current filter which `parentSearch` is being searched for.
            currentFiltersArray = currentfilters[j].filters;
            for (k = 0; k < currentFiltersArray.length; k += 1) { // Loop 3.
              if (currentFiltersArray[k].search === currentParentSearch) {
                result.push(currentfilters[i]); // Keep current "filter".
                console.log("Found " + currentParentSearch + " (from item #" + i + ") in item #" + j + ", filter #" + k);
                break loop_j; // Break loops 2 and 3.
              }
            }
            console.log("Did not find " + currentParentSearch + " (from item #" + i + ") in any other filter.");
          }
        }
      }
    }
    console.log(result);
    

    更新了jsfiddle:https://jsfiddle.net/0fttkyey/71/(来自上面问题的currentfilters,而不是jsfiddle版本32中的那个。)