如何避免数组中的项目在另一个集群中重复?
how to avoid an item in an array be repeated in another cluster?
我有一个数组或对象,大约 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"
]
如您所见,字符串 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);
}
您可以在循环范围外定义一组使用过的字符串,添加它们并在再次添加之前检查它们是否已添加到那里?
或者,如果您有有限数量(并且可能很容易迭代)的部件名称,您可以将它们保存为具有 true/false 值的键,以表示 'usable',您可以在使用时切换.
解决方法(在循环范围外使用"bank of used strings"):
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);
}
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);
});
我有一个数组或对象,大约 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"
]
如您所见,字符串 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);
}
您可以在循环范围外定义一组使用过的字符串,添加它们并在再次添加之前检查它们是否已添加到那里?
或者,如果您有有限数量(并且可能很容易迭代)的部件名称,您可以将它们保存为具有 true/false 值的键,以表示 'usable',您可以在使用时切换.
解决方法(在循环范围外使用"bank of used strings"):
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);
}
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);
});