Получить совокупный размер вложенного объекта - PullRequest
0 голосов
/ 29 января 2020

У меня есть следующий JS объект:

[
  {
    title: "cat1",
    children: [
      {
        title: "Monday",
        children: [
          { title: "size1", size: 120 },
          { title: "size2", size: 75 },
          { title: "size3", size: 45 }
        ]
      },
      {
        title: "Tuesday",
        children: [
          { title: "size1", size: 105 },
          { title: "size2", size: 45 },
          { title: "size3", size: 75 }
        ]
      }
    ]
  },
  {
    title: "cat2",
    children: [
      {
        title: "Monday",
        children: [
          { title: "size1", size: 60 },
          { title: "size2", size: 40 }
        ]
      }
    ]
  }
];

и я хочу оценить совокупность размеров в каждом гнезде. Скажем, я получу

[
  {
    title: "cat1",
    size: 465,
    children: [
      {
        title: "Monday",
        size: 240
      },
      {
        title: "Tuesday",
        size: 225
      }
    ]
  },
  {
    title: "cat2",
    size: 200,
    children: [
      {
        title: "Monday",
        size: 200
      }
    ]
  }
];

Пока у меня есть следующий код, но он не работает, если гнездо два или более. Я предполагаю, что это из-за чего-то, связанного с «звонком по ссылке», но не уверен, как это исправить. Кто-нибудь может мне помочь?

const getFrequency = (item: any) => {
    console.log(item);
    if (item[0].children[0].children === undefined) {
      item.map((item2: any) => ({
        title: item2.title,
        size: item2.children.reduce((prev: number, curr: any) => prev + curr.size, 0)
      }));
    } else {
      item.map((item2: any) => ({
        title: item2.title,
        children: item2.children,
        size: getFrequency(item2.children)
      }));
    }
    return item;
  };

const freqData = getFrequency(nestedData);

РЕДАКТИРОВАТЬ: он должен быть способен рекурсивно обрабатывать данные с более чем двумя гнездами.

1 Ответ

1 голос
/ 29 января 2020

const arr = [{
    title: "cat1",
    size: 465,
    children: [{
        title: "Monday",
        size: 240
      },
      {
        title: "Tuesday",
        size: 225
      }
    ]
  },
  {
    title: "cat2",
    size: 200,
    children: [{
      title: "Monday",
      size: 200
    }]
  }
];

arr.map(el => {
  const childSize = el.children.reduce((acc, item) => acc += item.size, 0);

  return { ...el,
    size: childSize
  }
});

console.log(arr)
...