Как получить все указанные значения c из массива объектов с вложенными массивами объектов? - PullRequest
2 голосов
/ 08 апреля 2020

У меня есть массив:

   const arr = [
  {
    name: "name 1",
    dontShow: true,
    children: [
      {
        name: "name 2",
        key4: 4,
        dontShow: false,
        children: [],
      },
    ],
  },
  {
    name: "name 3",
    dontShow: false,
    children: [
      {
        name: "name 4",
        dontShow: true,
        children: [
          {
            name: "name 5",
            dontShow: false,
            children: null,
          },
        ],
      },
    ],
  },
];

Мне нужен массив имен для каждого объекта, кроме тех, которые имеют свойство dontShow: true Так что из этого примера я бы ожидал такой массив:

["name2", "name3", "name5"]

В принципе, мне нужно получить плоский массив из древовидной структуры, решения lodash / underscore также были бы хороши, я просто не нашел их

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Вы можете использовать рекурсивную функцию

const arr = [{ name: "name 1", dontShow: true, children: [{  name:"name 2", key4: 4, dontShow: false, children: [], }, ],},{name: "name 3",dontShow: false,children: [{ name: "name 4", dontShow: true, children: [{ name: "name 5", dontShow: false, children: null,},],}, ],},];

let final = (arr, result = []) => {
  if (Array.isArray(arr)) {
    arr.forEach(obj => {
      if (!obj.dontShow) {
        result.push(obj.name)
      }
      if (Array.isArray(obj.children)) {
        final(obj.children, result)
      }
    })
  }
  return result
}

console.log(final(arr))
0 голосов
/ 08 апреля 2020

Вы можете получить плоский массив имен с видом dontShow.

const
    getNames = array => array.flatMap(({ name, dontShow, children }) => [
        ...(dontShow ? [] : [name]),
        ...getNames(children || [])
    ]),
    array = [{ name: "name 1", dontShow: true, children: [{ name: "name 2", key4: 4, dontShow: false, children: [] }] }, { name: "name 3", dontShow: false, children: [{ name: "name 4", dontShow: true, children: [{ name: "name 5", dontShow: false, children: null, }] }] }],
    result = getNames(array);

console.log(result);
...