Как отфильтровать первые объекты по второму уровню вложенности?

Цитата

const data = [
    {
      name: 'dir1',
      dir: [
        {
          name: 'dir1_inner',
          dir: []
        }
      ]
    },
    {
      name: 'dir2',
      dir: [
        {
          name: 'dir1_inner',
          dir: []
        },
        {
          name: 'dir3_inner',
          dir: []
        },
        {
          name: 'dir4_inner',
          dir: []
        },
      ]
    },
    {
      name: 'dir3',
      dir: [
        {
          name: 'dir1_inner',
          dir: []
        },
        {
          name: 'dir3_inner',
          dir: []
        }
      ]
    },
]


const allowed        = ['dir1', 'dir2', 'dir3']
const allowedInner   = ['dir3_inner']
const accesses       = []

allowed.map( allow => {

  accesses.push(...data.filter(data => !data.name.search(allow) ))

})

console.log(accesses)

в массив accesses должны попасть обЪекты у которых дети равны {name: 'dir3_inner'}

и сами дети должны остаться в виде полного обЪекта с {name: 'dir3_inner'}

data = [
    {
      name: 'dir2',
      dir: [
        {
          name: 'dir3_inner',
          dir: []
        }
      ]
    },
    {
      name: 'dir3',
      dir: [
        {
          name: 'dir3_inner',
          dir: []
        }
      ]
    }
]

Ответы (2 шт):

Автор решения: Евгений Платов

const data = [{
    name: 'dir1',
    dir: [{
      name: 'dir1_inner',
      dir: []
    }]
  },
  {
    name: 'dir2',
    dir: [{
        name: 'dir1_inner',
        dir: []
      },
      {
        name: 'dir3_inner',
        dir: []
      },
      {
        name: 'dir4_inner',
        dir: []
      },
    ]
  },
  {
    name: 'dir3',
    dir: [{
        name: 'dir1_inner',
        dir: []
      },
      {
        name: 'dir3_inner',
        dir: []
      }
    ]
  },
]


const allowed = ['dir1', 'dir2', 'dir3']
const allowedInner = ['dir3_inner']

const accesses = data.reduce((acc, el) => {
  const search = el.dir.filter((d) => allowedInner.includes(d.name));
  if (search.length > 0) {
    acc.push({
      name: el.name,
      dir: [search]
    });
  }
  return acc
}, []);

console.log(accesses)

→ Ссылка
Автор решения: Lukas

const allowed        = ['dir1', 'dir2', 'dir3']
const allowedInner   = ['dir3_inner']
const accesses       = []

const data = [
    {
      name: 'dir1',
      dir: [
        {
          name: 'dir1_inner',
          dir: []
        }
      ]
    },
    {
      name: 'dir2',
      dir: [
        {
          name: 'dir1_inner',
          dir: []
        },
        {
          name: 'dir3_inner',
          dir: []
        },
        {
          name: 'dir4_inner',
          dir: []
        },
      ]
    },
    {
      name: 'dir3',
      dir: [
        {
          name: 'dir1_inner',
          dir: []
        },
        {
          name: 'dir3_inner',
          dir: []
        }
      ]
    },
];

data.forEach(item => item.dir.some(el => el.name === 'dir3_inner') ? accesses.push(item) : "");

console.log(accesses);

→ Ссылка