我有一个包含两个变量,索引和类型的项目数组,需要根据这两个变量的完全匹配对这些项目进行分组。
[{ types: ['a', 'b'], indexes: ['i0', 'i1']}, { types: ['c', 'd'], indexes: ['i2', 'i3']}, ...]
目前,代码创建了一个包含项目中唯一的索引和类型对的数组,然后通过迭代并将它们添加到一个临时数组中将它们组合在一起。我相信这是通过lodash完成的,然后进行过滤以生成配对。
问题是,它当前仅检查项目是否包含唯一对中存在的所有类型和索引。因此,如果有一对类型为:a,b,c;它将匹配包含这三者的任意组合的任何事物,而不完全是这三者的组合。
我添加了对等的每项检查,以验证相反的方式,但是我不确定是否有更有效的方法来做到这一点。
最终结果应该是一个包含所有项目的数组,这些项目仅包含在两个方向上都完全匹配类型和索引的其他项目。
编辑:
因此,现有代码为:
const distinctIndexTypes =
_.uniqWith(
Object.values(items).map(item => { indexes: item.indexes, types: item.types }),
_.isEqual,
);
const queries = [];
distinctIndexTypes.forEach(indexType => {
const aggs = [];
Object.values(items).forEach(item => {
if (
indexType.indexes.every(index => item.indexes.includes(index)) &&
item.indexes.every(index => indexType.indexes.includes(index)) &&
item.types.every(type => indexType.types.includes(type)) &&
indexType.types.every(type => item.types.includes(type))
) {
aggs.push(item);
}
});
if (aggs.length > 0) {
queries.push({
aggs,
});
}
});
目标是获得一个包含类型和索引的查询数组,这些数组和类型与索引完全相等,以将查询数量从每一项减少到每个不同的集合。
答案 0 :(得分:0)
如何通过格式化键分组?
var groups = _.groupBy(items, item => _.sortBy(item.types) + ";" + _.sortBy(item.indexes))
var queries2 = _.map(groups, g => { return { aggs: g }; })