/ / Javascript, перевірте, чи знаходиться об'єкт поточної частини всередині іншого об'єкта частини - javascript, lodash

Javascript, перевірте, чи знаходиться об'єкт поточної частини всередині іншого об'єкта частини - javascript, lodash

Я намагаюся перетворити цикл на об’єкт і перевірити, чи єпевна властивість знаходиться всередині будь-яких інших певних частин об'єкта. Я намагаюся дізнатися, чи знаходиться перший рівень.Пошук у будь-якому іншому масиві 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 (в циклі зменшення) знаходиться в будь-якому іншому масиві фільтрів об'єктів (під властивістю .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 для відповіді № 1

Цікаво, що ваш currentfilters не вказано в jsfiddle, який ви надаєте, тому це не дає результату.

Якщо я правильно розумію, чого ви намагаєтесь досягти:

  1. Для кожного "фільтрувати" в currentfilters масив, перевірте, чи немає parentSearch член - truthy.
  2. Якщо так, петля через усі інший фільтри.
  3. Для кожного з цих фільтрів, петля через його filters член масиву
  4. Якщо search член одного з об’єктів у цьому filters масив дорівнює parentSearch значення, зберегти поточний "фільтр".

Отже, у вас є 3 вкладені петлі.

Дві зовнішні петлі повторюються однаково currentfilters масив, за винятком того, що другий (внутрішній) пропускає фільтр, який 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).