similarities = {
return names1
.map((name1) =>
names2.reduce((acc, name2) => {
const words1 = name1.name.split(" ");
const words2 = name2.name.split(" ");
if (
words1[words1.length - 1].trim() ==
words2[words2.length - 1].trim() &&
(!words1.slice(0, -1).some((word) => ignored.includes(word)) ||
!words2.slice(0, -1).some((word) => ignored.includes(word)))
) {
const commonWords = words1
.filter((word) => word.length > 0)
.slice(0, -1)
.filter((word) => !ignored.includes(word))
.filter((word) => words2.includes(word));
if (
commonWords.length > 0 &&
name1.name.trim().length > 0 &&
name2.name.trim().length > 0
) {
acc.push(
`Matching words: ${name1.name} and ${name2.name}: ${commonWords.length}: ${name1.id} : ${name2.id}`
);
}
if (checksimilar) {
const name1Chars = name1.name.split("");
const name2Chars = name2.name.split("");
const commonChars = name1Chars.filter((char) =>
name2Chars.includes(char)
);
const similarity =
commonChars.length /
Math.max(name1Chars.length, name2Chars.length);
if (similarity > similarityThreshold) {
acc.push(
`Similar letters: ${name1.name} and ${name2.name}: ${commonWords.length} : ${name1.id} : ${name2.id}`
);
}
}
}
return acc;
}, [])
)
.flat()
.filter((d) => d.length > 0)
.sort();
}