javascript - 如何避免数组中的项目在另一个集群中重复?

标签 javascript for-loop levenshtein-distance

我有一个数组或对象,大约 58000 个唯一字符串 (partName)。

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

这是代码。我正在尝试创建类似字符串的集群。

代码执行此操作,但是已经与集群连接的 partName 可以再次出现在另一个集群中。我想避免这种情况。一个唯一的部分名称应该只连接到一个集群。

这是我得到的一个例子:

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

如您所见,字符串 91329190 在以下集群中重复出现。 所以我的问题是:如何在连接到集群 后删除字符串 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);
}

最佳答案

您可以在循环范围之外定义一组使用过的字符串,添加它们并在再次添加它们之前检查它们是否已添加到那里?

或者,如果您有有限数量(并且可能很容易迭代)的部件名称,您可以将它们保存为具有 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);
}

关于javascript - 如何避免数组中的项目在另一个集群中重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46146158/

相关文章:

java - 由于在java上无法正常工作

r - 如何知道计算弦之间的Levenshtein距离所进行的运算?

javascript - 尝试使用 php 和 html 将记录添加到 mysql

javascript - 为什么在 javascript 中点击外部时不关闭下拉菜单

javascript - 从浏览器使用 tampermonkey 或 greasemonkey 更改 ip

java - 变量 "j"无法解析为变量 - 二维数组

javascript - Reactjs中获取checkbox的值

C# 为什么 List.Remove() 中断 'for loop' ?

php - 使用 PHP Levenshtein 比较 5000 个字符串

postgresql - 是否有多字节感知的 Postgresql Levenshtein?