Как избежать повторения элемента в массиве в другом кластере?

1

У меня есть массив или объекты, около 58000 уникальных строк (partName).

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

Вот код. Я пытаюсь создать кластеры похожих строк.

Код делает это, но partName, которое уже связано с кластером, может снова появиться в другом кластере. Я хочу избежать этого. Одно уникальное название части должно быть подключено только к кластеру ONE.

Вот пример, который я получаю:

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

Как видите, строки 9132, 9190 повторяются в следующем кластере. Поэтому мой вопрос: как удалить строки 9132, 9190 и 9279 после того, как они были связаны с кластером 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);
}
Теги:
for-loop
levenshtein-distance

2 ответа

1
Лучший ответ

Вы можете определить банк используемых строк вне области цикла, добавить их и проверить, были ли они добавлены туда, прежде чем добавлять их снова?

В качестве альтернативы, если у вас есть конечное (и потенциально легко повторяемое) количество имен деталей, вы можете удерживать их как ключи с истинным/ложным значением для представления "пригодного для использования", которое вы могли бы переключать при использовании.

Решение (используя "банк используемых строк" вне рамки цикла):

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню