我需要根据数据集值中已知键的两个或多个过滤器对对象进行分组。
我相信过滤是最好的方法,但是我所有的尝试都失败了。
var uniqueKeys = ['course','gradDate'];
var dataSet = [
{
lastName:'Jones',
course:'Standards',
gradDate:'12/12/2022'
},
{
lastName:'Smith',
course:'Standards',
gradDate:'12/12/2022'
},
{
lastName:'Martinez',
course:'Maths',
gradDate:'12/12/2022'
},
{
lastName:'Santiago',
course:'Photography',
gradDate:'12/11/2022'
},
{
lastName:'Alexi',
course:'Photography',
gradDate:'12/11/2022'
}
]
function returnUniqueValues(array,key){
return UniqueValue = [...new Set(array.map(item => item[key]))]
}
var uniqueCourses = returnUniqueValues(dataSet,'course')
//result for this dataset === ["Standards","Maths","Photography"];
var uniqueGradDates = returnUniqueValues(dataSet,'gradDate')
//Result for this dataset === ["12/12/2022","12/11/2022"];
从这里我有两个唯一值数组,我需要从源数据集(dataset)分组对象
如果我没有正确地描述它,我很抱歉,希望期望输出的示例将澄清它。
对于所有步骤,如果没有匹配双过滤器,则不返回任何内容。下面是我如何处理这个问题的示例步骤:
第一步将为所有具有course == "Standards"和一个毕业生==="2022年12月12日"。这里我将得到两个对象。然后,我将它传递给一个新数组以供稍后引用。
第二步将过滤源数据集,数据集中包含course == "Standards"and graduate === "12/11/2022"
第三步将过滤dataSet中包含course == "Maths"and graduate == "12/12/2022">
这个数据集的示例输出将是
var finalData = [
[{
lastName: 'Jones',
course: 'Standards',
gradDate: '12/12/2022'
},
{
lastName: 'Smith',
course: 'Standards',
gradDate: '12/12/2022'
},
],
[{
lastName: 'Martinez',
course: 'Maths',
gradDate: '12/12/2022'
}],
[{
lastName: 'Santiago',
course: 'Photography',
gradDate: '12/11/2022'
},
{
lastName: 'Alexi',
course: 'Photography',
gradDate: '12/11/2022'
}
]
]
最终目标是遍历每个组(在本例中是具有相同课程和研究生对的任何人)并使用他们的信息(如姓氏)填充报告。在这个例子中,course和graduate有3种独特的组合。我预计会有数千门不同的课程,最多有4个不同的日期。
您可以简单地使用'group-by'与指定属性的复合键。
这里调用map()
和join()
在你的uniqueKeys
数组为每个迭代对象生成复合键,然后检索或初始化属性使用逻辑空赋值(??=)之前,将对象推到它。结果是分组对象的Object.values()
。
const dataSet = [{ lastName: 'Jones', course: 'Standards', gradDate: '12/12/2022' }, { lastName: 'Smith', course: 'Standards', gradDate: '12/12/2022' }, { lastName: 'Martinez', course: 'Maths', gradDate: '12/12/2022' }, { lastName: 'Santiago', course: 'Photography', gradDate: '12/11/2022' }, { lastName: 'Alexi', course: 'Photography', gradDate: '12/11/2022' }];
const uniqueKeys = ['course', 'gradDate'];
const grouped = {};
for (const o of dataSet) {
const key = uniqueKeys.map(k => o[k]).join('_');
(grouped[key] ??= []).push(o);
}
const result = Object.values(grouped)
console.log(result);