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 № 1Curiosamente, 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 é:
- Para cada "filtro" em
currentfilters
matriz, verifique separentSearch
membro é verdade. - Se então, laço através de todos de outros filtros.
- Para cada um desses filtros, laço através do seu
filters
membro da matriz. - Se o
search
membro de um dos objetos nestefilters
matriz é igual aparentSearch
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).