javascript:重复时拆分多维数组

时间:2018-10-03 17:17:45

标签: javascript arrays multidimensional-array

我坚持根据成对和重复将数组分成多个部分。

我有这个数组:

var array = [[24, 17],[45, 17],[17, 24],[38, 31],[31, 38],[17, 45]];

我需要将其拆分以获取此信息:

var array = [[24,17,45],[38,31]];

有人对正确的方法有任何想法吗? 任何帮助将不胜感激!

3 个答案:

答案 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);