根据两个属性的唯一组合拆分对象数组
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】:从projectId
和taskId
创建一个复合键:
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)
或者使用lodash
groupby
:
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中的键合并和替换两个数组中的对象?