javascript - 创建相交值的数组
问题描述
以下是一些值数组:
values = [
[1,2,3],
[2,3,4],
[8,9,10],
[9,10,11],
[13,14,15]
];
当两个或多个数组的值相交时,我想创建新的数组值并集的数字排序数组。
这些新排序数组中的值将是唯一的。
如果一个数组不与任何其他数组相交,那么我们将该数组包含在结果中(例如[13,14,15]
在示例中)。
例如:
clusters = [
[1,2,3,4],
[8,9,10,11],
[13,14,15]
];
由于 value[0] 和 value[1] 相交,我们将它们的值的并集添加到集群中。
由于 value [2] 和 value[3] 相交,我们将它们的值的并集添加到集群中。
由于 value[4] 不与 value[0] 到 value[4] 相交,我们只需将 value[5] 添加到集群中。
现在,如果有value[6] = [3, 100]
,那么我们的集群将如下所示:
clusters = [
[1,2,3,4,100],
[8,9,10,11],
[13,14,15]
];
因为 value[6] 与 value[0] 和 value[1] 相交,所以我们添加到它们的并集。
有没有一种技术或最佳方法可以做到这一点?
在我的示例中,原始数组已排序,但不一定如此。
解决方案
这是一个编辑的片段,以响应使用 的评论.reduceRight()
,使用传递的数组的副本为累加器播种,并且仍然使用some()
和includes()
查找重复项。
reduceRight()
反向迭代数组,同时findIndex()
从头开始搜索。当找到匹配时,当前迭代数组被推送到匹配数组,然后使用 . 从累加器中删除当前元素splice()
。
function clusterDuplicates(arr) {
return arr
.reduceRight((a, arr, i) => {
if (i) {
let j = a.slice(0, i).findIndex(_arr => arr.some(x => _arr.includes(x)));
if (~j) {
a[j].push(...arr);
a.splice(i, 1);
}
}
return a
}, [...arr])
.map(arr => [...new Set(arr)].sort((a, b) => a - b));
}
console.log(clusterDuplicates([[1, 2, 3], [3, 4, 2], [8, 9, 10], [9, 11, 10], [14, 13, 15]]));
console.log(clusterDuplicates([[1, 2], [3, 4], [2, 3]]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
原始答案
如评论中所述,这无法提前查找重复项。
这是一个相当简洁的实现,使用和reduce()
查找交叉点。然后将结果映射以使用s 删除重复项,然后进行排序。some()
includes()
Set
const
values = [[1, 2, 3], [3, 4, 2], [8, 9, 10], [9, 11, 10], [14, 13, 15]],
result =
values
.reduce((a, arr) => {
let i = a.findIndex(_arr => arr.some(x => _arr.includes(x)));
if (i === -1) {
i = a.push([]) - 1;
}
a[i].push(...arr);
return a
}, [])
.map(arr => [...new Set(arr)].sort((a, b) => a - b));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- python - 建立平衡的团队
- r - 未列出时,包含向量列表的数据框如何具有不同的长度?
- d3.js - d3js中矩形的大小基于值的总和而不是项目的数量
- ios - Flutter DataStream 未正确关闭和重新构建。[不良状态:Stream 已经被收听。]
- json - 在 Perl 中解析 JSON 数据
- asp.net - 为什么我的 gridview 没有进入编辑模式?
- maven - mvnw 令人困惑的错误消息 NoPluginFoundForPrefixException
- asp.net-mvc - 电报机器人停止工作并出现错误:异步操作仍在等待中。- C#
- sql-server - SQL Server 授予远程访问权限以在给定架构中执行存储过程
- git - 从 Git 开始 - 个人提交和推送?还是一次全部?