Javascript 如何在JS中按公共元素分组子阵列

Javascript 如何在JS中按公共元素分组子阵列,javascript,arrays,Javascript,Arrays,我有一个子阵列。每个子阵列至少有一个元素,该元素至少在一个或多个子阵列中复制。例如: [ ['aaa', 'bbb', 'ccc'], ['ddd', 'aaa'], ['aaa', 'bbb', 'ccc', 'eee'], ['kkk', 'mmm', 'nnn'], ['mmm', 'ooo'] ] 在这种情况下,“ddd”和“eee”不会在任何地方复制,但相同子阵列中的其他元素至少在一个或多个子阵列中复制。我需要将元素分组到新的子阵列中,以接收以

我有一个子阵列。每个子阵列至少有一个元素,该元素至少在一个或多个子阵列中复制。例如:

[
    ['aaa', 'bbb', 'ccc'],
    ['ddd', 'aaa'],
    ['aaa', 'bbb', 'ccc', 'eee'],
    ['kkk', 'mmm', 'nnn'],
    ['mmm', 'ooo']
]
在这种情况下,“ddd”和“eee”不会在任何地方复制,但相同子阵列中的其他元素至少在一个或多个子阵列中复制。我需要将元素分组到新的子阵列中,以接收以下输出:

[
    ['aaa', 'bbb', 'ccc', 'ddd', 'eee'],
    ['kkk', 'mmm', 'nnn', 'ooo']
]

换句话说,我需要把“朋友”分组。因此,如果“ddd”是“aaa”的某个“朋友”,如果“eee”是“bbb”的某个“朋友”,“aaa”和“bbb”也都是朋友,我们将它们都分组到一个新的子数组中。但是“mmm”不是“aaa”、“bbb”等的朋友,而是kkk、nnn和ooo的朋友,所以将它们分组到另一个子数组中

您可以首先使用
reduce
Set
获得唯一值数组,然后
将其映射到具有唯一值的数组中

const数据=[
[‘aaa’、‘bbb’、‘ccc’],
['ddd','aaa'],
[‘aaa’、‘bbb’、‘ccc’、‘eee’],
[kkk','mmm','nnn'],
['mmm','ooo']
]
常数结果=数据减少((r,e)=>{
const match=r.find(a=>e.some(s=>a.has)))
如果(!match)r.push(新集合(e));
else e.forEach(el=>match.add(el))
返回r
},[]).map(e=>Array.from(e))

console.log(result)
您可以首先使用
reduce
Set
来获取唯一值数组,然后
将其映射到具有唯一值的数组

const数据=[
[‘aaa’、‘bbb’、‘ccc’],
['ddd','aaa'],
[‘aaa’、‘bbb’、‘ccc’、‘eee’],
[kkk','mmm','nnn'],
['mmm','ooo']
]
常数结果=数据减少((r,e)=>{
const match=r.find(a=>e.some(s=>a.has)))
如果(!match)r.push(新集合(e));
else e.forEach(el=>match.add(el))
返回r
},[]).map(e=>Array.from(e))

console.log(结果)
您可以使用Set和reduce

  • 在数组上循环,使用联接当前值将其用作键
  • 检查当前数组中的任何元素是否已存在于op上
  • 如果已存在,则将当前数组添加到现有集合,否则将设置为值为“当前数组为集合”的新键
let data=[[aaa]、[bbb]、[ccc']、[ddd]、[aaa]、[bbb]、[ccc]、[eee']、[kkk]、[mmm]、[nnn']、[mmm]、[ooo']
让final=data.reduce((op,inp)=>{
让key=inp.join(',')
let included=对象.键(op)
let found=include.find(v=>inp.some(curr=>v.includes(curr)))
如果(找到){
op[found]=新集合([…op[found],…inp])
}否则{
op[键]=新设置(inp)
}
返回操作
}, {})

console.log(Object.values(final.map)(v=>[…v]))
您可以使用Set和reduce

  • 在数组上循环,使用联接当前值将其用作键
  • 检查当前数组中的任何元素是否已存在于op上
  • 如果已存在,则将当前数组添加到现有集合,否则将设置为值为“当前数组为集合”的新键
let data=[[aaa]、[bbb]、[ccc']、[ddd]、[aaa]、[bbb]、[ccc]、[eee']、[kkk]、[mmm]、[nnn']、[mmm]、[ooo']
让final=data.reduce((op,inp)=>{
让key=inp.join(',')
let included=对象.键(op)
let found=include.find(v=>inp.some(curr=>v.includes(curr)))
如果(找到){
op[found]=新集合([…op[found],…inp])
}否则{
op[键]=新设置(inp)
}
返回操作
}, {})

console.log(Object.values(final.map)(v=>[…v]))
一个不同的解决方案,其中顺序无关紧要

除了给定的解决方案之外,还缺少将组与首先构建临时组的项目连接起来的情况,并且项目数组属于两个组,如

var data = [
        ['aaa', 'bbb', 'ccc'], // group aaa, bbb, ccc
        // ...
        ['x', 'y'],            // creates own group x, y
        ['x', 'aaa']           // fails here to join x, y with aaa, ...
    ],
使用此数据进行检查,并将组与单个组及其项目合并

此解决方案采用一个哈希表,其中项作为键,对象包含一个带有
集的单个属性

{ s: new Set }
这对于为同一组使用对象引用和为同一组使用集合引用是必要的,但对于不在实际数组中的项则不需要

如果后来发现hahs表的某个属性不等于实际组,或者该集合不等于该组的集合,则所有项都将获得相同的集合,并且该组的所有哈希值都将重新分配给该组集合

最后,从哈希表中获取值,仅set属性用于获取唯一集,并将这些集转换为数组

var数据=[[aaa]、[bbb]、[ccc']、[ddd]、[aaa]、[bbb]、[ccc]、[eee']、[kkk]、[mmm]、[nnn']、[mmm]、[ooo']、[x]、[y']、[x]、[aaa'],
散列=数据。减少((r,a)=>{
var common={s:new Set};
a、 forEach(v=>{
共同标准s.add(v);
如果(!r[v])返回r[v]=common;
if(r[v]==common | | r[v].s===common.s)返回;
common.s.forEach(k=>{
r[k].s=r[v].s;
r[v].s.add(k);
});
common.s=r[v].s;
});
返回r;
}, {}),
分组=数组
.from(新集合(Object.values(hash.map)({s})=>s)))
.map(s=>Array.from(s));
控制台日志(分组)

.as控制台包装{max height:100%!important;top:0;}
不同的解决方案,顺序无关紧要

除了给定的解决方案之外,还缺少将组与首先构建临时组的项目连接起来的情况,并且项目数组属于两个组,如

var data = [
        ['aaa', 'bbb', 'ccc'], // group aaa, bbb, ccc
        // ...
        ['x', 'y'],            // creates own group x, y
        ['x', 'aaa']           // fails here to join x, y with aaa, ...
    ],
使用此数据进行检查,并将组与单个组及其项目合并

此解决方案采用一个哈希表,其中项作为键,对象包含一个带有
集的单个属性

{ s: new Set }
这对于为同一组使用对象引用和为同一组使用集合引用是必要的,但对于不在实际数组中的项则不需要

如果后来发现hahs表的属性,且该属性不等于实际grou