Получение всего количества вложенных элементов - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть пост, ссылающийся на ключ группы lodash, если он существует в коллекции и возвращает следующую структуру.

{
  "sec": "11",
  "details": [{
      "id": "1",
      "user": "Me1"
    },
    {
      "id": "2",
      "uesr": "Me2",
      "childs": [{
          "id": "4",
          "user": "Me4",
          "parentID": "2"
        },
        {
          "id": "6",
          "user": "Me6",
          "parentID": "2"
        }
      ]
    },
    {
      "id": "3",
      "user": "Me3"
    },
    {
      "id": "5",
      "uesr": "Me5"
    },
    {
      "id": "7",
      "user": "Me7",
      "childs": [{
          "id": "8",
          "uesr": "Me8",
          "parentID": "7"
        },
        {
          "id": "9",
          "user": "Me9",
          "parentID": "7"
        }
      ]
    }
  ],
  "isDisplay": "true"
}

Мне нужно получить общее количество всех вложенных элементов, как всек 11, есть 9 пунктов.

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

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

const
    getCount = (s, { childs }) => (childs || []).reduce(getCount, s + 1),
    data = { sec: "11", details: [{ id: "1", user: "Me1" }, { id: "2", uesr: "Me2", childs: [{ id: "4", user: "Me4", parentID: "2" }, { id: "6", user: "Me6", parentID: "2" }] }, { id: "3", user: "Me3" }, { id: "5", uesr: "Me5" }, { id: "7", user: "Me7", childs: [{ id: "8", uesr: "Me8", parentID: "7" }, { id: "9", user: "Me9", parentID: "7" }] }], isDisplay: "true" },
    count = data.details.reduce(getCount, 0);
    
console.log(count);
0 голосов
/ 21 ноября 2018

Предполагая, что вы будете извлекать sec-11 объект.Вы можете использовать Array.reduce и рекурсивную функцию для получения результатов.

let obj = {"sec":"11","details":[{"id":"1","user":"Me1"},{"id":"2","uesr":"Me2","childs":[{"id":"4","user":"Me4","parentID":"2"},{"id":"6","user":"Me6","parentID":"2"}]},{"id":"3","user":"Me3"},{"id":"5","uesr":"Me5"},{"id":"7","user":"Me7","childs":[{"id":"8","uesr":"Me8","parentID":"7"},{"id":"9","user":"Me9","parentID":"7"}]}],"isDisplay":"true"};

function getCount(obj) {
  if(obj.childs) return obj.childs.reduce((a,c) => a + getCount(c) + 1, 0)
  return 0;
}

let sum = obj.details.reduce((a,c) => a + getCount(c) + 1, 0);
console.log(sum);
0 голосов
/ 21 ноября 2018

Вы можете посчитать все элементы с помощью рекурсивного function, который использует простой .forEach() вызов по заданному array.

. Вот как должен быть ваш код:

var items = 0;
function countItems(arr) {
  arr.forEach(a => {
    items += 1;
    if (a.childs)
      countItems(a.childs);
  });
}
countItems(data.details);

Демо:

var data = {
  "sec": "11",
  "details": [{
      "id": "1",
      "user": "Me1"
    },
    {
      "id": "2",
      "uesr": "Me2",
      "childs": [{
          "id": "4",
          "user": "Me4",
          "parentID": "2"
        },
        {
          "id": "6",
          "user": "Me6",
          "parentID": "2"
        }
      ]
    },
    {
      "id": "3",
      "user": "Me3"
    },
    {
      "id": "5",
      "uesr": "Me5"
    },
    {
      "id": "7",
      "user": "Me7",
      "childs": [{
          "id": "8",
          "uesr": "Me8",
          "parentID": "7"
        },
        {
          "id": "9",
          "user": "Me9",
          "parentID": "7"
        }
      ]
    }
  ],
  "isDisplay": "true"
};

var items = 0;
function countItems(arr) {
  arr.forEach(a => {
    items += 1;
    if (a.childs)
      countItems(a.childs);
  });
}
countItems(data.details);

console.log(items);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...