Как извлечь из вложенной структуры элементы удовлетворяющие условию?

Ссылка скопирована
1 ответ

Пример рабочий:

snippet

Есть массив:

const myarr = {     "id": 1,     "title": "Профильная часть",     "placeholder": "Профильная часть",     "type": "part",     "typeName": "profile",     "lectures": 0,     "practice": 6,     "homework": 0,     "content": [       {         "id": 2,         "title": "intermediate current",         "placeholder": "dadada",         "type": "module",         "lectures": 0,         "practice": 6,         "homework": 0,         "content": [           {             "id": 3,             "title": "intermediate current",             "placeholder": "ccccc",             "type": "theme",             "lectures": 0,             "practice": 6,             "homework": 0,             "content": [               {                 "id": 4,                 "title": "intermediate current",                 "description": "ccccc",                 "placeholder": "zxczcx",                 "period": [                   {                     "id": 6,                     "value": 6,                     "title": "6 недели"                   },                   {                     "id": 4,                     "value": 4,                     "title": "4 недели"                   }                 ],                 "workControl": [                   "intermediate",                   "current"                 ],                 "lectures": 0,                 "practice": 6,                 "homework": 0,                 "type": "practice",                 "content": []               }             ]           }         ]       },       {         "id": 52,         "title": "intermediate current",         "placeholder": "dadada",         "type": "module",         "lectures": 0,         "practice": 6,         "homework": 0,         "content": [           {             "id": 53,             "title": "intermediate",             "placeholder": "ccccc",             "type": "theme",             "lectures": 0,             "practice": 6,             "homework": 0,             "content": [               {                 "id": 54,                 "title": "intermediate",                 "description": "ccccc",                 "placeholder": "zxczcx",                 "period": [                   {                     "id": 56,                     "value": 6,                     "title": "6 недели"                   },                   {                     "id": 54,                     "value": 4,                     "title": "4 недели"                   }                 ],                 "workControl": [                   "intermediate"                 ],                 "lectures": 0,                 "practice": 6,                 "homework": 0,                 "type": "practice",                 "content": []               }             ]           }         ]       }, ]

const myarr = { "id": 1, "title": "Профильная часть", "placeholder": "Профильная часть", "type": "part", "typeName": "profile", "lectures": 0, "practice": 6, "homework": 0, "content": [ { "id": 2, "title": "intermediate current", "placeholder": "dadada", "type": "module", "lectures": 0, "practice": 6, "homework": 0, "content": [ { "id": 3, "title": "intermediate current", "placeholder": "ccccc", "type": "theme", "lectures": 0, "practice": 6, "homework": 0, "content": [ { "id": 4, "title": "intermediate current", "description": "ccccc", "placeholder": "zxczcx", "period": [ { "id": 6, "value": 6, "title": "6 недели" }, { "id": 4, "value": 4, "title": "4 недели" } ], "workControl": [ "intermediate", "current" ], "lectures": 0, "practice": 6, "homework": 0, "type": "practice", "content": [] } ] } ] }, { "id": 52, "title": "intermediate current", "placeholder": "dadada", "type": "module", "lectures": 0, "practice": 6, "homework": 0, "content": [ { "id": 53, "title": "intermediate", "placeholder": "ccccc", "type": "theme", "lectures": 0, "practice": 6, "homework": 0, "content": [ { "id": 54, "title": "intermediate", "description": "ccccc", "placeholder": "zxczcx", "period": [ { "id": 56, "value": 6, "title": "6 недели" }, { "id": 54, "value": 4, "title": "4 недели" } ], "workControl": [ "intermediate" ], "lectures": 0, "practice": 6, "homework": 0, "type": "practice", "content": [] } ] } ] }, ]

Что из него нужно достать:
Объекты, у которых в свойстве workControl присутствует значение 'intermediate':

[    {       "id":2,       "title":"intermediate current",       "placeholder":"dadada",       "type":"module",       "lectures":0,       "practice":6,       "homework":0,       "content":[          {             "id":3,             "title":"intermediate current",             "placeholder":"ccccc",             "type":"theme",             "lectures":0,             "practice":6,             "homework":0,             "content":[                {                   "id":4,                   "title":"intermediate current",                   "description":"ccccc",                   "placeholder":"zxczcx",                   "period":[                      {                         "id":6,                         "value":6,                         "title":"6 недели"                      },                      {                         "id":4,                         "value":4,                         "title":"4 недели"                      }                   ],                   "workControl":[                      "intermediate",                      "current"                   ],                   "lectures":0,                   "practice":6,                   "homework":0,                   "type":"practice",                   "content":[                                         ]                }             ]          }       ]    },    {       "id":52,       "title":"intermediate current",       "placeholder":"dadada",       "type":"module",       "lectures":0,       "practice":6,       "homework":0,       "content":[          {             "id":53,             "title":"intermediate",             "placeholder":"ccccc",             "type":"theme",             "lectures":0,             "practice":6,             "homework":0,             "content":[                {                   "id":54,                   "title":"intermediate",                   "description":"ccccc",                   "placeholder":"zxczcx",                   "period":[                      {                         "id":56,                         "value":6,                         "title":"6 недели"                      },                      {                         "id":54,                         "value":4,                         "title":"4 недели"                      }                   ],                   "workControl":[                      "intermediate"                   ],                   "lectures":0,                   "practice":6,                   "homework":0,                   "type":"practice",                   "content":[                                         ]                }             ]          }       ]    } ]

[ { "id":2, "title":"intermediate current", "placeholder":"dadada", "type":"module", "lectures":0, "practice":6, "homework":0, "content":[ { "id":3, "title":"intermediate current", "placeholder":"ccccc", "type":"theme", "lectures":0, "practice":6, "homework":0, "content":[ { "id":4, "title":"intermediate current", "description":"ccccc", "placeholder":"zxczcx", "period":[ { "id":6, "value":6, "title":"6 недели" }, { "id":4, "value":4, "title":"4 недели" } ], "workControl":[ "intermediate", "current" ], "lectures":0, "practice":6, "homework":0, "type":"practice", "content":[ ] } ] } ] }, { "id":52, "title":"intermediate current", "placeholder":"dadada", "type":"module", "lectures":0, "practice":6, "homework":0, "content":[ { "id":53, "title":"intermediate", "placeholder":"ccccc", "type":"theme", "lectures":0, "practice":6, "homework":0, "content":[ { "id":54, "title":"intermediate", "description":"ccccc", "placeholder":"zxczcx", "period":[ { "id":56, "value":6, "title":"6 недели" }, { "id":54, "value":4, "title":"4 недели" } ], "workControl":[ "intermediate" ], "lectures":0, "practice":6, "homework":0, "type":"practice", "content":[ ] } ] } ] } ]

Рабочий, но громоздкий код и не универсальный:

let arr = []; let currentControl = myarr.map(part => { 					part.content.filter(elem => { 						if(elem.content.length){ 							console.log('elee', elem.title) 							elem.content.filter(elem2 => { 								if(elem2.content.length){ 									console.log('el2', elem2) 									elem2.content.filter(elem3 => { 										console.log('el3', elem3) 										if(elem3.workControl.filter(control => { 											console.log('control', control) 											if(control == 'intermediate'){ 												arr.push(elem) 											} 										})) 										return [] 									}) 									return  [] 								} 							}) 							return [] 						} 					}) 				}); document.getElementById("dd").prepend(JSON.stringify(arr))

let arr = []; let currentControl = myarr.map(part => { part.content.filter(elem => { if(elem.content.length){ console.log('elee', elem.title) elem.content.filter(elem2 => { if(elem2.content.length){ console.log('el2', elem2) elem2.content.filter(elem3 => { console.log('el3', elem3) if(elem3.workControl.filter(control => { console.log('control', control) if(control == 'intermediate'){ arr.push(elem) } })) return [] }) return [] } }) return [] } }) }); document.getElementById("dd").prepend(JSON.stringify(arr))

Подскажите как зациклить его через map или reduce без использования функций.

Дополнительно:

Портянки длинные прячьте под спойлер. А codepen правильно отображать через кнопку +

Ответы:

Рекурсия есть:

const getNestedData = (data, test) => Object   .values(data instanceof Object ? data : {})   .reduce((acc, n) => (     acc.push(...getNestedData(n, test)),     acc   ), test(data) ? [ data ] : []);   const result = getNestedData(arr, n => n?.workControl?.includes?.('intermediate'));

const getNestedData = (data, test) => Object .values(data instanceof Object ? data : {}) .reduce((acc, n) => ( acc.push(...getNestedData(n, test)), acc ), test(data) ? [ data ] : []); const result = getNestedData(arr, n => n?.workControl?.includes?.('intermediate'));

Рекурсии нет:

function getNestedData(data, test) {   const result = [];    for (const stack = [ data ]; stack.length; ) {     const n = stack.pop();      if (n instanceof Object) {       stack.push(...Object.values(n).reverse());     }      if (test(n)) {       result.push(n);     }   }    return result; }  // или  function getNestedData(data, test) {   const result = [];   const stack = [];    for (let i = 0, arr = [ data ]; i < arr.length || stack.length; i++) {     if (i === arr.length) {       [ i, arr ] = stack.pop();     } else {       if (test(arr[i])) {         result.push(arr[i]);       }        if (arr[i] instanceof Object) {         stack.push([ i, arr ]);         [ i, arr ] = [ -1, Object.values(arr[i]) ];       }     }   }    return result; }

function getNestedData(data, test) { const result = []; for (const stack = [ data ]; stack.length; ) { const n = stack.pop(); if (n instanceof Object) { stack.push(...Object.values(n).reverse()); } if (test(n)) { result.push(n); } } return result; } // или function getNestedData(data, test) { const result = []; const stack = []; for (let i = 0, arr = [ data ]; i < arr.length || stack.length; i++) { if (i === arr.length) { [ i, arr ] = stack.pop(); } else { if (test(arr[i])) { result.push(arr[i]); } if (arr[i] instanceof Object) { stack.push([ i, arr ]); [ i, arr ] = [ -1, Object.values(arr[i]) ]; } } } return result; }

  • Рекурсии нет

    ... а переполнение стека есть)

    getNestedData(Array(200000).fill({workControl: ['intermediate']}), (item) => item.workControl?.includes('intermediate'))

    getNestedData(Array(200000).fill({workControl: ['intermediate']}), (item) => item.workControl?.includes('intermediate'))

  • Alexandroppolus, да плевать.

    Но если кому вдруг нет:

    - stack.push(...Object.values(n).reverse()); + Object.values(n).reverse().forEach(m => stack.push(m));

    - stack.push(...Object.values(n).reverse()); + Object.values(n).reverse().forEach(m => stack.push(m));

  • 0xD34F, я не правильно задал вопрос, мне родители еще нужны "type": "module", и "type": "theme".
  • Xpage, вместо того, чтобы перекраивать вопрос, и тем самым превращать уже опубликованные ответы в мусор, вам следовало оформить новый вопрос.
  • 0xD34F, извините, не знал(
    Верну обратно условия, чуть позже
function getIntermediateItems(tree, result = []) {   tree?.forEach((item) => {     if (item.workControl?.includes('intermediate')) {       result.push(item);     }     getIntermediateItems(item.content, result);   });   return result; }  const arr = getIntermediateItems(myarr); document.getElementById("dd").prepend(JSON.stringify(arr, '', 4))

function getIntermediateItems(tree, result = []) { tree?.forEach((item) => { if (item.workControl?.includes('intermediate')) { result.push(item); } getIntermediateItems(item.content, result); }); return result; } const arr = getIntermediateItems(myarr); document.getElementById("dd").prepend(JSON.stringify(arr, '', 4))

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Никита Орлов Ответ

Для извлечения элементов из вложенной структуры, удовлетворяющих определенному условию, можно воспользоваться рекурсивной функцией или методом. Ниже приведен пример кода на языке программирования PHP, который поможет вам понять, как это можно сделать:

function extractElements($array, $condition) {
    $result = [];
 
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $result = array_merge($result, extractElements($value, $condition));
        } else {
            if ($condition($value)) {
                $result[] = $value;
            }
        }
    }
 
    return $result;
}
 
// Пример использования
$data = [
    'key1' => 'value1',
    'key2' => [
        'subkey1' => 'subvalue1',
        'subkey2' => 'subvalue2'
    ],
    'key3' => 'value3'
];
 
$condition = function($element) {
    return strpos($element, 'value') !== false;
};
 
$result = extractElements($data, $condition);
 
print_r($result);

function extractElements($array, $condition) { $result = []; foreach ($array as $key => $value) { if (is_array($value)) { $result = array_merge($result, extractElements($value, $condition)); } else { if ($condition($value)) { $result[] = $value; } } } return $result; } // Пример использования $data = [ 'key1' => 'value1', 'key2' => [ 'subkey1' => 'subvalue1', 'subkey2' => 'subvalue2' ], 'key3' => 'value3' ]; $condition = function($element) { return strpos($element, 'value') !== false; }; $result = extractElements($data, $condition); print_r($result);

В этом примере функция `extractElements` принимает вложенный массив и условие в виде анонимной функции. Она рекурсивно проходит по всем элементам массива, проверяя каждый элемент на соответствие условию. Если элемент удовлетворяет условию, он добавляется в результирующий массив.

Вы можете адаптировать этот код под свои конкретные условия и структуру данных, чтобы извлечь нужные элементы. Не забудьте также проверить входные данные на корректность, чтобы избежать ошибок во время выполнения кода.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно