6

私は組合の発見に取り組んでいます。インデックスの 1 つが別のペアのインデックスと数値を共有しているかどうかに基づいて、数値のペアをグループ化したいと考えています。そう:

次のようなペアの配列があります。

pairs: [[1,3], [6,8], [3,8], [2,7]]

このようなユニオンでそれらをグループ化する最良の方法は何ですか:

[ [ 1, 3, 8, 6 ], [ 2, 7 ] ]

([1,3] と [3,8] は 3 を共有するため一緒になります。そのグループは 8 を共有するため [6,8] と結合します。javascript でこれを行う最良の方法は何ですか?

他の例を次に示します。

pairs: [[8,5], [10,8], [4,18], [20,12], [5,2], [17,2], [13,25],[29,12], [22,2], [17,11]]

into [ [ 8, 5, 10, 2, 17, 22, 11 ],[ 4, 18 ],[ 20, 12, 29 ],[ 13, 25 ] ]

編集 私が現在使用している方法は次のとおりです。

findUnions = function(pairs, unions){
   if (!unions){
       unions = [pairs[0]];
       pairs.shift();
   }else{
       if(pairs.length){
           unions.push(pairs[0])
           pairs.shift()
       }
   }

    if (!pairs.length){
        return unions
    }
    unite = true
    while (unite && pairs.length){
        unite = false
        loop1:
        for (i in unions){
            loop2:
            var length = pairs.length;
            for (j=0;j<length;j++){
                if (unions[i].includes(pairs[j][0])){
                    if (!unions[i].includes(pairs[j][1])){
                        unions[i].push(pairs[j][1])
                        pairs.splice(j, 1)
                        j-=1;
                        length-=1
                        unite = true
                    }else{
                        pairs.splice(j, 1)
                        j-=1
                        length-=1
                    }
                }else if (unions[i].includes(pairs[j][1])){
                     unions[i].push(pairs[j][0])
                     pairs.splice(j, 1)
                     unite = true
                    j-=1
                    length-=1
                }
            }
        }
    }
    return findUnions(pairs, unions)
}
4

3 に答える 3

1

最初の要件を満たすために、配列を反復できます。反復手順内で、隣接するすべてのインデックスを含む新しい配列から現​​在の配列を除外します。隣接する配列に現在の配列の要素が 1 つ以上含まれているかどうかを確認します。true の場合、要素を新しい配列にプッシュします。

以前にフィルター処理された配列の要素を含まない要素の元の配列をフィルター処理します。

Set配列から重複するエントリを削除するために使用します。

const arr = [[1,3], [6,8], [3,8], [2,7]];

let res = [];

for (const[key, [a, b]] of Object.entries(arr)) {
  const adjacent = arr.filter((el, index) => index !== +key);

const has = adjacent.filter(el => el.includes(a) || el.includes(b));
  res = [...res, ...has.filter(prop => !res.includes(prop))];
}

let not = new Set(...arr.filter(([a, b]) => !res.some(([c, d]) => 
            a === c || b === d || a === d || b === c)));

let set = new Set();

for (const [a, b] of res) {
  if (!set.has(a)) set.add(a);
  if (!set.has(b)) set.add(b);
}

res = [[...set], [...not]];

console.log(res);

于 2017-07-26T01:20:07.563 に答える