当前位置: 首页 > 知识库问答 >
问题:

按具有条件和自定义键的对象数组分组

郝君博
2023-03-14

我有下面的对象数组,

[{

    a: 1,
    created_on: '2021-04-23 10:00:01',
}, {
    b: 1,
    created_on: '2021-04-24 09:03:01',
}, {
    b: 1,
    created_on: '2021-04-24 13:03:01',
}]

首先,我需要用忽略时间的日期分组。

所以,

{
 "2021-04-23": [{
    a: 1,
    created_on: '2021-04-23 10:00:01',
  }],
....
}

如果是像created_on:'2021-04-23'这样的日期,我可以使用lodash/groupby

我仍然可以使用它,但现在它涉及到一些条件,将那些created_on转换为日期格式。

此外,我还需要按那些按日期结果分组的对象进行分组,以便它们的created_on落在一个时间间隔内。

"SALES_SLOTS": [
    {
      "slot": "00:00-04:00"
    },
    {
      "slot": "04:00-08:00"
    }, 
    {
      "slot":"08:00-12:00"
    }, 
    {
      "slot":"12:00-16:00"
    },
    {
      "slot":"16:00-20:00"
    },
    {
      "slot":"20:00-24:00"
    }
  ],

因此,如果created_on:'2021-04-23 10:00:01',它应该在组中,

{
  "08:00-12:00": [{
     a: 1,
     created_on: '2021-04-23 10:00:01',
  }]
}

因此,首先应该按照创建日期对结果进行分组,然后再按照定义的时隙对每个组中的元素进行分组。

我想,如果我可以使用条件分组,我可以达到预期的结果。

共有1个答案

颜镜
2023-03-14

>

  • 按日期分组相当简单,您可以使用映射created_on.slice(0,10)对数据进行分组。

    然后,我创建了一个帮助函数getslot,它根据经过的时间返回一个槽。现在,由于您的插槽相当宽,只测试小时部分就足够了。

    接下来,对于每组日期,再次使用GetSlothelper和Map按时间分组,并使用Object.FromentRies您可以获得所需的对象。

    注意:我在代码中使用了表达式而不是语句(使用逗号、默认参数),这只是一个优先选择。

    null

    const 
      arr = [{ a: 1, created_on: "2021-04-23 10:00:01" }, { b: 1, created_on: "2021-04-24 09:03:01" }, { b: 1, created_on: "2021-04-24 13:03:01" }],
      
      slots = [{ slot: "00:00-04:00" }, { slot: "04:00-08:00" }, { slot: "08:00-12:00" }, { slot: "12:00-16:00" }, { slot: "16:00-20:00" }, { slot: "20:00-24:00" }],
          
      grpDate = Array.from(
        arr.reduce(
          (m, o, _i, _arr, d = o.created_on.slice(0, 10)) => (
            m.has(d) ? m.get(d).push(o) : m.set(d, [o]), m
          ),
          new Map()
        )
      ),
      
      getSlot = (time) =>
        slots
          .find(({ slot }) => time > slot.slice(0, 2) && time < slot.slice(6, 8))
          .slot,
          
      grpSlot = grpDate.map(([k, v]) =>
        [k, Object.fromEntries(v.reduce(
          (m, o, _i, _arr, slot = getSlot(o.created_on.slice(11, 13))) => (
            m.has(slot) ? m.get(slot).push(o) : m.set(slot, [o]), m
          ),
          new Map()
        ))]
      );
    
    console.log(Object.fromEntries(grpSlot));

  •  类似资料:
    • 我试图用Vuejs 2实现自定义选择组件。如文档中所述,我不应该直接修改值属性,并建议使用事件将选定的数据传递给父组件。当选项值是一个对象时,我遇到了问题,却得到了[Object object]。 这是我的选择组件模板: 这是脚本部分: 这是父组件 选项: 我期待 但得到了[Object object] 我错过了什么吗?

    • 是否可以在OpenAPI中为组件对象指定自定义名称? 我目前有两个组件对象指定请求模式: 在endpoint描述中,我将这些模式引用如下: 当我发布yaml文件时,UI在选择选项卡中显示Request est1和Request est2,其中包含名称“Request est1”和“Request est2”。是否可以为它们分配自定义名称,以便UI显示自定义名称?例如“自定义名称请求1”和“自定义名

    • 有人知道一种方法(如果可能的话也可以使用lodash)通过对象键对对象数组进行分组,然后根据分组创建新的对象数组吗?例如,我有一个汽车对象数组: 我想制作一个由分组的新汽车对象数组:

    • 我在创建包含自定义对象数组的数组时遇到了问题。 出于多种原因,我希望将容器创建为可比较数组的标准数组: 其中包含的每个自定义对象数组必须具有不同的长度 自定义对象数组内置了自动排序工具,这些工具不适合我希望它们适合的较大包含数组 自定义对象数组可以工作,并且已经过彻底测试。 我在创建较大对象时收到的例外情况是: 线程“main”中出现异常java.lang.ClassCastException:

    • 问题内容: 我在解析给定的JSON数据时遇到了一个奇怪的问题。我有这个JSON结构: 如何使用Newtonsoft JSON.NET库解析此结构?我尝试使用自己的JsonConverter类: 但我有一个例外: 编辑:我也试图将其保存到字典: 但我还有一个例外: 我做错了什么?谢谢您的回答。 问题答案: 您似乎想要在JSON中将a表示为对象数组,其中每个嵌套对象都有一个来自字典的键和值。您可以使用

    • 问题内容: 我有一个对象数组,这些对象的属性称为“ CODE”。 如何通过自定义顺序对数组进行排序,例如: 尝试各种方法均未成功。请帮忙。 问题答案: 您可以将函数与函数一起使用。