如何从数组对象分组

问题描述 投票:0回答:3

我使用代码形式“我正在寻找做到这一点的最佳方法。我有小组:数据

[
  {
     "date": "16/04/2020",
     "count": 0,
     "name": "A"
  },
  {
     "date": "16/04/2020",
     "count": 1,
     "name": "B"
  },
  {
     "date": "17/04/2020",
     "count": 0,
     "name": "B"
  }                     
  //...More.....
]
          
答案
{
    "date": "04/2020",
    "symtom": {
        "data": [
            {
                "date": "16/04/2020",
                "data": [
                    {
                        "name": "A",
                        "count": [
                            {
                                "date": "16/04/2020",
                                "count": 0,
                                "name": "A"
                            }
                        ]
                    },
{
                        "name": "B",
                        "count": [
                            {
                                "date": "16/04/2020",
                                "count": 1,
                                "name": "B"
                            }
                        ]
                    },
                    //...More.....
                ]
            },
            {
                "date": "17/04/2020",
                "data": [
                    {
                        "name": "B",
                        "count": [
                            {
                                "date": "17/04/2020",
                                "count": 0,
                                "name": "B"
                            }
                        ]
                    },
                    //...More.....
                ]
            }
        ]
    }
}

我可以修复代码并获得所需的答案吗?代码:

const items = [
  {
    tab: 'Results',
    section: '2017',
    title: 'Full year Results',
    description: 'Something here',
  },
    {
    tab: 'Results',
    section: '2017',
    title: 'Half year Results',
    description: 'Something here',
  },
    {
    tab: 'Reports',
    section: 'Marketing',
    title: 'First Report',
    description: 'Something here',
  }
];

function groupAndMap(items, itemKey, childKey, predic){
    return _.map(_.groupBy(items,itemKey), (obj,key) => ({
        [itemKey]: key,
        [childKey]: (predic && predic(obj)) || obj
    }));
}

var result = groupAndMap(items,"tab","sections", 
                   arr => groupAndMap(arr,"section", "items"));


console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

ref:Group array of object nesting some of the keys with specific names但是我想得到这个答案(答案):

{
    "date": "04/2020",
    "symtom": {
        "data": [
            {
                "date": "16/04/2020",
                "data": [
                    {
                        "name": "A",
                        "count":  0,
                    },
                    {
                        "name": "B",
                        "count":  1,
                    },
                    //...More.....
                ]
            },
            {
                "date": "17/04/2020",
                "data": [
                    {
                        "name": "B",
                        "count":0,
                    },
                    //...More.....
                ]
            }
        ]
    }
}
谢谢!
javascript arrays object lodash
3个回答
1
投票

我是一个初学者,但看起来您希望system.data.data =带有键名称:str和count:number的对象数组,但是您将整个对象应用于count,所以键count:{name :A,count:0,d​​ate:etc}。

我真的不能遵循您的功能来分离数据...但是您要做的就是在将计数发送给对象以进行引用时,只需要像object.count这样的点表示法来访问数字与对象方式,您将拥有所需的影响。希望这就是您要问的。


1
投票

我将使用一个辅助函数groupBy(此版本以Ramda中的API建模[免责声明:我是其作者之一],但足够短,只需在此处包括即可。)此函数需要一个将一个对象映射到一个键值,然后将您的元素分组为一个对象,这些键指向原始元素的数组。

我们需要使用两次,一次按月分组,然后在结果内部按日分组。 transform函数的其余部分只是按照我认为的方式格式化输出。

const groupBy = (fn) => (xs) => 
  xs .reduce((a, x) => ({... a, [fn(x)]: [... (a [fn (x)] || []), x]}), {})

const transform = (data) => 
  Object .entries (groupBy (({date}) => date.slice(3)) (data))     // group by month
    .map (([date, data]) => ({
      date, 
      symtom: {
        data: Object .entries (groupBy (({date}) => date) (data))  // group by day
              .map (([date, data]) => ({
                date, 
                data: data .map (({date, ...rest}) => ({...rest})) // remove date property
              }))
      }
    }))

const data = [{date: "16/04/2020", count: 0, name: "A"}, {date: "16/04/2020", count: 1, name: "B"}, {date: "17/04/2020", count: 0, name: "B"}, {date: "03/05/2020", count: 0, name: "C"}];

console .log (
  transform (data)
)
.as-console-wrapper {min-height: 100% !important; top: 0}

如果需要在environment without Object.entries中运行,则很容易进行匀场。


1
投票

您可以为每个嵌套组使用一个函数,并减少数组和分组级别。

Object.entries
var data = [{ date: "16/04/2020", count: 0, name: "A" }, { date: "16/04/2020", count: 1, name: "B" }, { date: "17/04/2020", count: 0, name: "B" }],
    groups = [
        (o, p) => {
            var date = o.date.slice(3),
                temp = p.find(q => q.date === date);
            if (!temp) p.push(temp = { date, symptom: { data: [] } });
            return temp.symptom.data;
        },
        ({ date }, p) => {
            var temp = p.find(q => q.date === date);
            if (!temp) p.push(temp = { date, data: [] });
            return temp.data;
        },
        ({ date, ...o }, p) => p.push(o)
    ],
    result = data.reduce((r, o) => {
        groups.reduce((p, fn) => fn(o, p), r);
        return r;
    }, []);

console.log(result);
© www.soinside.com 2019 - 2024. All rights reserved.