我坚持根据成对和重复将数组分成多个部分。
我有这个数组:
var array = [[24, 17],[45, 17],[17, 24],[38, 31],[31, 38],[17, 45]];
我需要将其拆分以获取此信息:
var array = [[24,17,45],[38,31]];
有人对正确的方法有任何想法吗? 任何帮助将不胜感激!
答案 0 :(得分:2)
您可以使用Set
的幂,并检查值之一是否已在一组中。如果没有,请使用新的结果集创建新的结果集。
var array = [[24, 17], [45, 17], [17, 24], [38, 31], [31, 38], [17, 45]],
result = array
.reduce((r, a) => {
var s = r.find(s => a.some(Set.prototype.has, s));
if (s) {
a.forEach(v => s.add(v));
} else {
r.push(new Set(a));
}
return r;
}, [])
.map(s => Array.from(s));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
您可以将数组spreading展平为Array.concat()
,然后reduce展平。使用辅助程序Set
,在检测到重复项时添加新的子数组。然后,过滤出空数组:
const array = [[24, 17],[45, 17],[17, 24],[38, 31],[31, 38],[17, 45]];
const helperSet = new Set();
const result = [].concat(...array)
.reduce((r, n) => {
!r[r.length - 1] && r.push([]);
if(!helperSet.has(n)) {
r[r.length - 1].push(n)
helperSet.add(n);
} else {
r.push([]);
};
return r;
}, [])
.filter(({ length }) => length);
console.log(result);
答案 2 :(得分:1)
您可以使用将特定网格映射到碰撞的哈希表,因此可以轻松地将它们分组:
const array = [[24, 17],[45, 17],[17, 24],[38, 31],[31, 38],[17, 45]];
const result = [], hash = {};
for(const [a, b] of array) {
let group = hash[a] || hash[b] || (arr => (result.push(arr), hash[a] = hash[b] = arr))([]);
if(!group.includes(a)) group.push(a);
if(!group.includes(b)) group.push(b);
}
console.log(result);