首页 > 解决方案 > 获取嵌套对象的总大小

问题描述

我有以下 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);

编辑:它必须能够递归处理具有两个以上嵌套的数据。

标签: javascriptnestedaggregate

解决方案


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)


推荐阅读