Javascript 移除包含公共元素的子数组
作为标题,如果输入为[[1,2],[3,4],[1,3],[5,6],[6,5],则输出应为[[1,2,3,4],[5,6]]。 递归部分是错误的。在我的代码中,在运行它之后,我将得到[[1,2,3]、[1,3,4]、[5,6]],这意味着我需要再次合并,但我不知道如何继续代码,直到没有子数组包含公共元素 这是我的代码Javascript 移除包含公共元素的子数组,javascript,arrays,Javascript,Arrays,作为标题,如果输入为[[1,2],[3,4],[1,3],[5,6],[6,5],则输出应为[[1,2,3,4],[5,6]]。 递归部分是错误的。在我的代码中,在运行它之后,我将得到[[1,2,3]、[1,3,4]、[5,6]],这意味着我需要再次合并,但我不知道如何继续代码,直到没有子数组包含公共元素 这是我的代码 function need_merge_or_not(arr) { for (var i = 0; i <= arr.length-1; i++) { fo
function need_merge_or_not(arr)
{
for (var i = 0; i <= arr.length-1; i++) {
for (var j = i+1; j <= arr.length-1; j++) {
var arr_new = arr[i].concat(arr[j]);
//remove deplicates
var arr_merge = arr_new.filter(function (item, pos) {return arr_new.indexOf(item) == pos});
if (arr_merge.length < arr_new.length) {
return true;
}
}
}
return false;
}
function merge(arr)
{
if (arr.length >= 2) {
for (var i = 0; i <= arr.length-1; i++) {
for (var j = i+1; j <= arr.length-1; j++) {
var arr_new = arr[i].concat(arr[j]);
var arr_merge = arr_new.filter(function (item, pos) {return arr_new.indexOf(item) == pos});
if (arr_merge.length < arr_new.length) {
arr.splice(arr.indexOf(arr[i]), 1);
arr.splice(arr.indexOf(arr[j]),1);
arr.push(arr_merge);
}
}
if (need_merge_or_not(arr)) {
return merge(arr);
}
}
}
return arr;
}
函数是否需要合并(arr)
{
对于(var i=0;i您可以使用两个哈希表,一个用于项目及其组
,另一个用于结果集
基本上,该算法为同一组生成一个具有属性和数组的对象,因为它允许在分配新数组时保留对象引用
主要部分是先迭代外部数组,然后迭代内部数组并检查内部,如果它是第一项,则检查哈希表是否存在,如果不存在,则生成一个新对象,其中包含一个values属性和一个空数组作为值。还可以将实际对象分配给集,其中item作为键
在下一步中,再次检查哈希表,如果不存在,则分配第一个元素的对象
要仅维护唯一值,将进行检查,如果该项不存在,则将该项推送到哈希表的值数组
然后,通过检查第一个项目的对象是否与实际项目的对象不相等来连接数组的一部分。如果是这样,它将从中删除实际项目的值第一个项目中的键,并将实际项目的数组连接到第一个项目的对象值。然后将值对象分配给实际项目的值反对
随后,通过迭代集合
对象,将集合
映射到结果集,并将values属性作为值
var数组=[[1,2]、[3,4]、[1,3]、[5,6]、[6,5]],
组={},
集合={},
结果;
array.forEach(函数(a){
a、 forEach(函数(b,i,bb){
如果(i==0&&!组[b]){
组[b]={值:[]};
集合[b]=组[b];
}
如果(!组[b]){
组[b]=组[bb[0]];
}
if(组[b].values.indexOf(b)=-1){
组[b]。值。推送(b);
}
如果(组[bb[0]]!==组[b]){
删除集合[组[b]。值[0];
组[bb[0]]。值=组[bb[0]]。值。concat(组[b]。值);
组[b]。值=组[bb[0]]。值;
}
});
});
结果=对象。键(集合)。映射(函数(k){
返回集[k]。值;
});
console.log(结果);
。作为控制台包装{max height:100%!important;top:0;}
我找到了它。下面是代码:
function merge(arr){
var input = [];
for(var i = 0; i < arr.length; i++){
input.push(arr[i]);
}
if (arr.length >= 2) {
for (var i = 0; i < arr.length; i++) {
for (var j = i+1; j < arr.length; j++) {
var arr_new = arr[i].concat(arr[j]);
//remove duplicates
var arr_merge = arr_new.filter(function (item, pos) {return arr_new.indexOf(item) == pos});
if (arr_merge.length < arr_new.length) {
arr.splice(arr.indexOf(arr[i]), 1, arr_merge);
arr.splice(arr.indexOf(arr[j]),1);
j--;
}
}
}
if (!arraysEqual(input, arr)) {merge(arr)};
}
return arr;
//Input:[[1,2], [3,4], [1,3], [5,6], [6,5]]
//Output:[[1,2,3,4], [5,6]]
}
function arraysEqual(a, b) {
if (a === b) return true;
if (a == null || b == null) return false;
if (a.length != b.length) return false;
for (var i = 0; i < a.length; ++i) {
if (a[i] !== b[i]) return false;
}
return true;
}
函数合并(arr){
var输入=[];
对于(变量i=0;i=2){
对于(变量i=0;i
抱歉,这是一个输入错误,输出应该是[[1,2,3,4],[5,6]]。为什么要对结果进行分组?可能会重复编辑您的帖子,而不是留下评论。我不理解这个问题。您需要更清楚地描述它,和/或提供更多示例。