2017-09-10 2 views
1

私は約58000の一意の文字列(partName)を持つ配列を持っています。配列内のアイテムを避ける方法を別のクラスタで繰り返すか?

parts = [ 
{ _id: 59a942a8c0b7467bf08711df, partName: '0' }, 
{ _id: 59a94299c0b7467bf084a917, partName: '9129' }, 
{ _id: 59a94299c0b7467bf084a918, partName: '9130' }, 
.., 
.. ] 

ここにコードがあります。私は似たような文字列のクラスタを作成しようとしています。

コードではこれが実行されますが、既にクラスタに接続されているpartNameは別のクラスタに再び表示されます。私はこれを避けたい。 1つの固有のパーツ名は、1つのクラスタにのみ接続してください。ここで

は私が得る例です:あなたは、文字列9132を見ることができるように

{ 
    "9129": [ 
     "9132", 
     "9190", 
     "9279" 
    ] 
    }, 
    { 
    "9130": [ 
     "9132", 
     "9180", 
     "9190", 
     "9430" 
    ] 

9190は、以下のクラスタ内で繰り返されています。 私の質問は、913291909279という文字列をクラスタ9129に接続した後で、文字列を削除するにはどうすればよいですか?

function createCluster(arrayOfParts) { 
    let clusterArray = []; 
    for (var i = 0; i < 5; i++) { 
    let cluster = []; 
    y = 1; 
    console.log(arrayOfParts[i]); 
    for (var j = y; j < arrayOfParts.length; j++) { 
     if (
     fuzzball.token_sort_ratio(
      arrayOfParts[i].partName, 
      arrayOfParts[j].partName 
     ) > "70" 
    ) { 
     if (
      arrayOfParts[i].partName.toLowerCase() !== 
      arrayOfParts[j].partName.toLowerCase() && 
      !cluster.includes(arrayOfParts[j].partName) 
     ) { 
      cluster.push(arrayOfParts[j].partName); 
     } 
     } 
    } 
    let obj = {}; 
    obj[arrayOfParts[i].partName] = cluster.sort(); 
    clusterArray.push(obj); 
    } 
    console.log("clusterArray", JSON.stringify(clusterArray, null, 2)); 
    console.log("clusterArray.length", clusterArray.length); 
} 

答えて

1

あなたはループの範囲外で使用される文字列のバンクを定義することができ、それらを追加し、彼らは再びそれらを追加する前に、そこに追加されているかどうかを確認?

また、部品名が有限(かつ容易に反復可能)である場合は、使用時に切り替えることができる「使用可能」を表すtrue/false値のキーとして保持できます。 (ループの範囲外で "使用される文字列のバンク" を使用)

対処:

function createCluster(arrayOfParts) { 
    let usedStrings = []; 
    let clusterArray = []; 
    for (var i = 0; i < 5; i++) { 
    let cluster = []; 
    y = 1; 
    if (usedStrings.includes(arrayOfParts[i].partName)) { 
     continue; 
    } 
    console.log(arrayOfParts[i]); 
    for (var j = y; j < arrayOfParts.length; j++) { 
     if (
     fuzzball.token_sort_ratio(
      arrayOfParts[i].partName, 
      arrayOfParts[j].partName 
     ) > "70" 
    ) { 
     if (
      arrayOfParts[i].partName.toLowerCase() !== 
      arrayOfParts[j].partName.toLowerCase() && 
      !cluster.includes(arrayOfParts[j].partName) && 
      !usedStrings.includes(arrayOfParts[j].partName) 
     ) { 
      cluster.push(arrayOfParts[j].partName); 
      usedStrings.push(arrayOfParts[j].partName); 
     } 
     } 
    } 
    let obj = {}; 
    obj[arrayOfParts[i].partName] = cluster.sort(); 
    clusterArray.push(obj); 
    } 
    console.log("clusterArray", JSON.stringify(clusterArray, null, 2)); 
    console.log("clusterArray.length", clusterArray.length); 
} 
1
parts = [ 
     { _id: "59a942a8c0b7467bf08711df", partName: 9111 }, 
     { _id: "59a94299c0b7467bf084a917", partName: 9129 }, 
     { _id: "59a94299c0b7467bf084a918", partName: 9130 }, 
     { _id: "59a94299c0b7467bf084a919", partName: 9131 }, 
     { _id: "59a94299c0b7467bf084a920", partName: 9130 } 
]; 

var arrayToTestAgainst = []; 

parts.forEach(function(part) { 
    if (!arrayToTestAgainst.includes(part.partName)) { 
    arrayToTestAgainst.push(part.partName); 
    } 
    console.log(arrayToTestAgainst); 
}); 

https://codepen.io/shagamemnon0/pen/yomrJa

関連する問題