根据两个属性的唯一组合拆分对象数组

Posted

技术标签:

【中文标题】根据两个属性的唯一组合拆分对象数组【英文标题】:Splitting an array of objects based on unique combinations of two properties 【发布时间】:2019-05-05 03:30:04 【问题描述】:

对于我的时间跟踪应用程序,我将时间条目存储在一个对象数组中,每个对象如下所示:


  date: "20181206",
  hours: "4",
  projectId: "65WchP9X46HlOYUzmWrL",
  taskId: "fJTU7wggJHbg1uRuRUdHjS5mn8J3"

我需要通过 ProjectId - TaskId 属性的唯一组合将所有对象分组到单独的数组中,以便每个结果数组获取一个特定项目和一项特定任务的所有条目(project #1 的数组/task #1,另一个用于project #1 / task #2,另一个用于project #2 / task #1,等等)。

我知道如何用一个属性做到这一点,但是有没有一种简单的方法可以用两个属性实现相同的效果?

注意:我的全局数组最初是这样填充的:

weekTimes = [];
querySnapshot.forEach((doc) => 
  weekTimes.push(doc.data());
);

【问题讨论】:

【参考方案1】:

projectIdtaskId 创建一个复合键:

grouped = 

for (weekTime of weekTimes) 
  var key = `$weekTime.projectId/$weekTime.taskId`

  if (grouped[key] === undefined) 
    // if the key doesn't exist, weekTime is the first item, create the key 
    // and assign an array with the first item to it
    grouped[key] = [ weekTime ]
   else 
    // if the key already exists in grouped, just push new item to that key
    grouped[key].push(weekTime)
  


// if you don't need the keys
Object.values(grouped)

或者使用lodashgroupby:

const _ = require('lodash')

_.groupBy(weekTimes, x => x.projectId + '/' + x.taskId)

【讨论】:

谢谢!但是,grouped 中的每个数组都包含给定项目的所有条目,而不管taskId,而我想要一个数组用于projectId/taskId 的每个不同组合:一个数组用于 p1/t1,另一个用于 p1/ t2,另一个用于 p1/t3,当然另一个用于 p2/tx。现在,我得到一个数组,其中包含 p1/t1、p1/t2/p1/t3 的所有条目... 应该是这样的。如果不查看您的代码,我真的无法判断。也许您可以发布一个可重现的示例? 实际上您的代码运行良好,但我的实现存在缺陷。谢谢!不过我不太明白,有没有办法可以编辑和解释一下?如果您不介意的话,尤其是grouped[key].push(weekTime)grouped[key] = [ weekTime ] 部分。谢谢! 已添加说明。还对逻辑进行了重新排序,使其更加清晰。

以上是关于根据两个属性的唯一组合拆分对象数组的主要内容,如果未能解决你的问题,请参考以下文章

怎么把一个数组拆分为两个啊,如a=1,2,3,4,5,6,7拆分后为a=1,2,7b=3

如何根据javascript中的键合并和替换两个数组中的对象?

javascript 数组对象根据相同属性值{key:value}合并两个对象

从数组中拆分出对象属性和值[重复]

将数组拆分为按对象属性分组的 2 个数组 [重复]

获取拆分为字符串数组的对象的“类”属性