整合对象数组的算法问题,求解!

发布于 2022-09-13 01:13:32 字数 2340 浏览 21 评论 0

源数据

const resData = [
  {dict: '东北', type: '二线', isProvinceCapital: '是', city: '哈尔滨', money: 100},
  {dict: '东北', type: '二线', isProvinceCapital: '是', city: '沈阳', money: 200},
  {dict: '东北', type: '三线', isProvinceCapital: '否', city: '大兴安岭', money: 300},
  {dict: '华东', type: '一线', isProvinceCapital: '是', city: '上海', money: 400},
  {dict: '华东', type: '二线', isProvinceCapital: '是', city: '杭州', money: 500},
  {dict: '华东', type: '二线', isProvinceCapital: '否', city: '宁波', money: 600}
];
// 处理数据的方法!
function formatData(keys) {

}

下面是输入期望输出结果

// 1
// 输入 ['isProvinceCapital']
// 输出如下:
let list = [
  {
    isProvinceCapital: '是',
    children: [
      {dict: '东北', type: '二线', isProvinceCapital: '是', city: '哈尔滨', money: 100},
      {dict: '东北', type: '二线', isProvinceCapital: '是', city: '沈阳', money: 200},
      {dict: '华东', type: '一线', isProvinceCapital: '是', city: '上海', money: 400},
      {dict: '华东', type: '二线', isProvinceCapital: '是', city: '杭州', money: 500},
    ]
  },
  {
    isProvinceCapital: '否',
    children: [
      {dict: '东北', type: '三线', isProvinceCapital: '否', city: '大兴安岭', money: 300},
      {dict: '华东', type: '二线', isProvinceCapital: '否', city: '宁波', money: 600}
    ]
  }
];

// 2
// 输入 ['dict', 'type']
// 输出如下:
let list2 = [
  {
    dict: '东北',
    children: [
      {
        dict: '东北',
        type: '二线',
        children: [
          {dict: '东北', type: '二线', isProvinceCapital: '是', city: '哈尔滨', money: 100},
          {dict: '东北', type: '二线', isProvinceCapital: '是', city: '沈阳', money: 200}
        ]
      },
      {
        dict: '东北',
        type: '三线',
        children: [
          {dict: '东北', type: '三线', isProvinceCapital: '否', city: '大兴安岭', money: 300}
        ]
      }
    ]
  },
  {
    dict: '华东',
    children: [
      {
        dict: '华东',
        type: '一线',
        children: [
          {dict: '华东', type: '一线', isProvinceCapital: '是', city: '上海', money: 400}
        ]
      },
      {
        dict: '华东',
        type: '二线',
        children: [
          {dict: '华东', type: '二线', isProvinceCapital: '是', city: '杭州', money: 500},
          {dict: '华东', type: '二线', isProvinceCapital: '否', city: '宁波', money: 600}
        ]
      },
    ]
  }
];

formatData方法如何实现,感谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爺獨霸怡葒院 2022-09-20 01:13:32
const formatData = (data, keys) => Object.entries(
    data.reduce((acc, item) => (
        (acc[item[keys[0]]] ??= []).push(item),
        acc
    ), {})
).map(([ keyvalue, children ]) => ({
    [keys[0]]: keyvalue,
    children: keys.length > 1
        ? formatData(children, keys.slice(1)).map(child => ({
            [keys[0]]: keyvalue,
            ...child
        }))
        : children
}))

这个只带了本层的 key,我睡觉了明天完善一下
好啦
又修了一下,确实好啦

帅气尐潴 2022-09-20 01:13:32

就是递归多级分组。分组可以用 .reduce 自己实现,我懒,用 Lodash

import _ from "lodash";

function formatData(data, keys) {
    if (!(keys?.length)) { return data; }
    const [key, ...restKeys] = keys;
    return _(resData)
        .groupBy(it => it[key])
        .entries()
        .map(([name, children]) => ({
            [key]: name,
            children: formatData(children, restKeys)
        }))
        .value();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文