/ / Javascript, verifique se o objeto atual está dentro de outro objeto - javascript, lodash

Javascript, verifique se o objeto atual está dentro de outro objeto - javascript, lodash

Estou tentando fazer um loop sobre um objeto e verificar se umdeterminada propriedade está dentro de outras partes do objeto. Estou tentando ver se o primeiro level.parentSearch está dentro de qualquer outra matriz firstlevel.filters (de objetos).

Então, meu objeto se parece com isso, por exemplo:

    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
}]
}
];

Então, o que estou tentando alcançar é fazer um loopeste objeto e modifique-o um pouco (se necessário) e retorne-o. O que estou tentando fazer é verificar o primeiro nível se a propriedade .parentSearch estiver dentro de qualquer um dos outros objetos .filter array como uma propriedade .search. Portanto, neste exemplo, isSubTopic seria o que eu estou procurando, porque está dentro da matriz de filtros Tópicos.

Esta é a minha primeira vez tentando esse tipo deproblema, por isso, se estiver faltando alguma coisa, por favor me avise. Imaginei que, como eu quero retornar um objeto modificado, seria bom reduzir esse objeto e verificar o interior. A parte com a qual estou lutando é o bit que verifica se meu parentSearch atual (no loop de redução) está em qualquer outra matriz de filtro de objetos (na propriedade .search). Eu tenho lodash para mexer, então tentei tanto _.find e _.has, mas acho que não estou abordando isso corretamente. Qualquer entrada / toda seria muito apreciada!

Aqui está o que eu estava tentando: 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;

}

Respostas:

1 para resposta № 1

Curiosamente, seu currentfilters não é o mesmo no jsfiddle que você fornece, portanto não dá resultado.

Se bem entendi, o que você tenta alcançar é:

  1. Para cada "filtro" em currentfilters matriz, verifique se parentSearch membro é verdade.
  2. Se então, laço através de todos de outros filtros.
  3. Para cada um desses filtros, laço através do seu filters membro da matriz.
  4. Se o search membro de um dos objetos neste filters matriz é igual a parentSearch mantenha o "filtro" atual.

Então você tem 3 loops aninhados.

Os 2 loops externos iteram sobre o mesmo currentfilters matriz, exceto que o 2º (interno) ignora o filtro que parentSearch O valor está sendo pesquisado.

Assim que parentSearch for encontrado, interrompa os loops 2 e 3 (os 2 mais internos) e vá para o próximo item do 1º loop (mais externo).

Sem usar o lodash e construir uma nova matriz de resultados (em vez de modificar currentfilters matriz no local que pode produzir resultados inesperados), você teria, por exemplo:

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 atualizado: https://jsfiddle.net/0fttkyey/71/ (com currentfilters da pergunta acima, em vez da pergunta na versão 32 do jsfiddle).